你能模拟一个实现接口和抽象类的对象吗?

mrb*_*lah 10 c# unit-testing moq

是否可以使用Moq来模拟实现接口和抽象类的对象?

即:

public class MyClass: SomeAbstractClass, IMyClass
Run Code Online (Sandbox Code Playgroud)

你能嘲笑这个吗?

Mar*_*ann 6

您可以模拟任何界面以及任何抽象或虚拟成员.基本上就是这样.

这意味着以下是绝对可能的:

var imock = new Mock<IMyClass>();
var aMock = new Mock<SomeAbstractClass>();
Run Code Online (Sandbox Code Playgroud)

如果继承自SomeAbstractClass的成员未被密封,您还可以模拟MyClass:

var mcMock = new Mock<MyClass>();
Run Code Online (Sandbox Code Playgroud)

这是否有意义取决于MyClass的实现.假设SomeAbstractClass的定义如下:

public abstract class SomeAbstractClass
{
    public abstract string GetStuff();
}
Run Code Online (Sandbox Code Playgroud)

如果MyClass中的GetStuff方法是这样实现的,你仍然可以覆盖它:

public override string GetStuff()
{
    return "Foo";
}
Run Code Online (Sandbox Code Playgroud)

这将允许你写:

mcMock.Setup(x => x.GetStuff()).Returns("Bar");
Run Code Online (Sandbox Code Playgroud)

因为除非明确密封,否则GetStuff仍然是虚拟的.但是,如果你写了这样的GetStuff:

public override sealed string GetStuff()
{
    return "Baz";
}
Run Code Online (Sandbox Code Playgroud)

你无法模仿它.在这种情况下,您将从Moq获得一个例外,声明它是非虚拟成员的无效覆盖(因为它现在是sealed).