mrb*_*lah 10 c# unit-testing moq
是否可以使用Moq来模拟实现接口和抽象类的对象?
即:
public class MyClass: SomeAbstractClass, IMyClass
Run Code Online (Sandbox Code Playgroud)
你能嘲笑这个吗?
您可以模拟任何界面以及任何抽象或虚拟成员.基本上就是这样.
这意味着以下是绝对可能的:
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).