你能模拟一个实现接口和抽象类的对象吗?
是否可以使用Moq来模拟实现接口和抽象类的对象?
即:
public class MyClass: SomeAbstractClass, IMyClass
你能嘲笑这个吗?
您可以模拟任何界面以及任何抽象或虚拟成员。 基本上就是这样。
这意味着以下是绝对可能的:
var imock = new Mock(); var aMock = new Mock();
如果inheritance自SomeAbstractClass的成员未被密封,您还可以模拟MyClass:
var mcMock = new Mock();
这是否有意取决于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
)。
你的问题没有意义。 Moq可用于模拟抽象类和接口。 由于MyClass
既不是,所以你不能创建它的模拟。 我不认为这是一个问题,因为MyClass实例的消费者可能期望SomeAbstractClass
或IMyClass
实例而不是MyClass
实例。 如果他们确实期望一个MyClass
实例,那么你需要在它上面做一些抽象。 这可以通过让SomeAbstractClass
实现IMyClass
接口,或者让IMyClass
接口公开IMyClass
的方法和属性来SomeAbstractClass
。