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

是否可以使用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实例的消费者可能期望SomeAbstractClassIMyClass实例而不是MyClass实例。 如果他们确实期望一个MyClass实例,那么你需要在它上面做一些抽象。 这可以通过让SomeAbstractClass实现IMyClass接口,或者让IMyClass接口公开IMyClass的方法和属性来SomeAbstractClass