在方法中模拟对象

时间:2019-07-03 09:27:40

标签: c# unit-testing mocking

我在以下方法中遇到了麻烦单元测试。我无法模拟MyClass,但是我需要填充其中的道具才能对方法的其余部分进行单元测试。是否可以创建MyClass实例并在单元测试中进行评估?

public async Task<MyResponse> Handle(MyRequest request, CancellationToken cancellationToken)
{
    MyClass obj = new MyClass();

    _dependecy.Execute(obj);

    foreach(var o in obj.Props)
    {
        //do some processing
    }

}

1 个答案:

答案 0 :(得分:3)

您需要注入MyClass的实例作为构造函数参数,属性或方法参数。然后,您可以对其进行模拟并传递一个模拟的实例,或者根据您的代码,可能不必对其进行模拟,而只需传递一个MyClass实例并为测试设置属性即可。

通过构造函数传递MyClass

public class ClassThatUsesMyClass
{
    private readonly MyClass _myClass;

    public ClassThatUsesMyClass(MyClass myClass)
    {
        _myClass = myClass;
    }

    public async Task<MyResponse> Handle(MyRequest request, 
        CancellationToken cancellationToken)
    {
        // This method uses the _myClass field instead of creating an instance of MyClass
    }
}

或作为方法参数:

public class ClassThatUsesMyClass
{
    public async Task<MyResponse> Handle(MyRequest request, MyClass myClass, 
        CancellationToken cancellationToken)
    {
        // This method uses the myClass argument instead of creating an instance of MyClass
    }
}

在两种情况下,类接收一个MyClass的实例,而不是创建。这就是我们所说的依赖注入。MyClass是依赖关系,即依赖或需要的东西。)

因为它作为参数传递,所以单元测试能够首先设置其属性。