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

时间:2009-12-28 13:36:01

标签: c# unit-testing moq

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

即:

public class MyClass: SomeAbstractClass, IMyClass

你能嘲笑这个吗?

2 个答案:

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