c#模拟接口vs模拟类

che*_*cai 3 .net c# unit-testing moq mocking

我是.net中的moq框架的新手.从我的在线研究来看,似乎有两种方法可以利用这个框架.模拟界面或模拟具体类.似乎在模拟具体类时,只能virtual模拟方法.在我的例子中,我只想模拟一个实现接口的类的方法.

例如,如果我们有以下内容:

public interface Ifoo
{
    int Bar();
}

public class Foo : Ifoo
{
    public virtual int Bar()
    {
        return 0;
    }
}

public class Client
{
    public Client(Ifoo foo)
    {
        var temp = foo.Bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我需要单元测试Client,我需要在ctor中传递一个模拟的Ifoo对象.在这种情况下,我应该这样做:

var mock = new Mock<Ifoo>();
Run Code Online (Sandbox Code Playgroud)

要么

var mock = new Mock<Foo>();
Run Code Online (Sandbox Code Playgroud)

它对我的情况有影响吗?模拟界面与模拟类的优缺点是什么?对我来说,模拟接口总是一个更好的解决方案,因为模拟一个类只能给出virtual方法的模拟.

S.C*_*.C. 6

以下是需要考虑的一些要点:

  • 你的客户消耗IFoo,这就是你应该嘲笑的东西.
  • 如果您的客户端使用具体类,您应该考虑重构您的客户端以使用接口或抽象类,而不是遵守SOLID原则.
  • 如果您的客户端在测试期间使用Foo模拟而不是接口,并且它依赖于该测试中的一些非模拟行为,那么您实际上并不是在编写单元测试,因为您正在测试多个行为单元.
  • 如果您的客户端在测试期间没有使用任何非模拟行为,那么您最好还是传递一个模拟的接口.

tldr:类应该使用接口或抽象类而不是具体类.测试应该模拟接口或抽象类而不是具体类.