答案 0 :(得分:6)
您可以模拟任何界面以及任何抽象或虚拟成员。基本上就是这样。
这意味着以下内容绝对可能:
var imock = new Mock<IMyClass>();
var aMock = new Mock<SomeAbstractClass>();
如果从SomeAbstractClass继承的成员没有被密封,你也可以模拟MyClass:
var mcMock = new Mock<MyClass>();
这是否有意义取决于MyClass的实现。假设SomeAbstractClass的定义如下:
public abstract class SomeAbstractClass
{
public abstract string GetStuff();
}
如果MyClass中的GetStuff方法是这样实现的,你仍然可以覆盖它:
public override string GetStuff()
{
return "Foo";
}
这将允许你写:
mcMock.Setup(x => x.GetStuff()).Returns("Bar");
因为除非明确密封,否则GetStuff仍然是虚拟的。但是,你有没有像这样编写GetStuff:
public override sealed string GetStuff()
{
return "Baz";
}
你无法嘲笑它。在这种情况下,您将从Moq获得一个例外,声明它是非虚拟成员的无效覆盖(因为它现在是sealed
)。
答案 1 :(得分:0)
你的问题没有意义。 Moq可用于模拟抽象类和接口。由于MyClass
既不是,所以你不能创建它的模拟。
我不认为这是一个问题,因为MyClass实例的消费者可能期望SomeAbstractClass
或IMyClass
实例而不是MyClass
实例。如果他们确实期望MyClass
实例,那么你需要在它之上进行一些抽象。这可以通过SomeAbstractClass
实现IMyClass
接口,或让IMyClass
接口公开SomeAbstractClass
的方法和属性来实现。