【问题标题】:Mock one method on a class instead of the whole class using Moq?使用 Moq 模拟一个类而不是整个类的方法?
【发布时间】:2012-07-26 16:23:06
【问题描述】:

我有课

public interface IMyInterface 
{
    string MethodA();
    void MethodB();
}

public class MyClass : IMyInterface
{
    public string MethodA()
    {
        // Do something important
    }

    public void MethodB()
    {
        string value = MethodA();
        // Do something important
    }
}

我想对 MethodB 进行单元测试,但我无法思考如何在使用 Moq 调用 MethodB 的同时模拟 MethodA。 Moq 模拟的是界面,而不是类,所以我不能只调用mock.Object.MethodB(),对吧?

这可能吗?如果有,怎么做?

【问题讨论】:

  • 注解:实际使用Moq可以模拟类,但是对类有一些要求。类不能被密封。并且被模拟的方法必须标记为虚拟的。也不能是静态方法。

标签: c# .net unit-testing moq


【解决方案1】:

我认为这是不可能的。即使有可能我也不想那样做。

您正在测试MyClass 的行为,事实上它恰好实现了IMyInterface 与 MethodA 和 MethodB 的测试行为有些无关。您可以进行单独的测试,以确保该类实现了您希望它在必要时实现的接口。 MyClass.MethodB 的测试应该在 MyClass 的实例上完成,而不是在半模拟对象上。

如果您认为 MethodA 的行为是依赖关系,您可以尝试从类中显式提取它。它将允许测试 MethodA(它将简单地委托给依赖项)和 MethodB(它将使用依赖项并执行更多操作)。

【讨论】:

    【解决方案2】:

    模拟你不能轻易(或全部)实例化的依赖项。
    MyClass 是正在测试的类,因此不应被模拟(您不想测试模拟值)。
    但是,如果你有一些 MyClass.Foo 属性,它是类 Foo,它实现了 IFoo 接口并且 MethodA 使用这个 Foo 属性,那么你可以模拟它来打破依赖关系。

    【讨论】:

      猜你喜欢
      • 2014-08-13
      • 2017-08-21
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多