c# - 在方法中模拟一个对象

标签 c# unit-testing mocking

我在单元测试下面的方法时遇到问题。我不能模拟 MyClass 但我需要填写其中的 Prop 才能对方法的其余部分进行单元测试。是否可以创建 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
    }

}

最佳答案

您需要将 MyClass 的实例作为构造函数参数、属性或方法参数注入(inject)。然后,您可以模拟它并传入模拟实例,或者根据您的代码,可能不需要模拟它,您可以只传递一个 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 的实例而不是创建它。这就是我们所说的依赖注入(inject)。(MyClass 是依赖,即它所依赖或需要的东西。)

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

关于c# - 在方法中模拟一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56866991/

相关文章:

C#在Unity游戏引擎中开箱后的倒计时

c++ - cxxTestgen.py 抛出语法错误

c# - 通信协议(protocol)的单元测试

iphone - iPhone 样机网络服务

python - 如何为 python 单元测试提供模拟类方法?

c# - 获取对象调用层次结构

c# - 用于通过 C#(使用 SSL)运行 FTP 服务器的组件或源代码

angular - Jasmine HTTP 测试未覆盖 RXJS 管道

php - 在 phpUnit 中模拟异常

c# - MissingMethodException 但我不明白为什么