如何使用Moq测试抽象类中的具体方法?

20

过去,当我想要模拟一个抽象类时,我只需在代码中创建一个扩展该抽象类的模拟类,然后在我的单元测试中使用该类...

public abstract class MyConverter : IValueConverter
{
    public abstract Object Convert(...);

    public virtual Object ConvertBack(...) { ... }
}

private sealed class MockedConverter : MyConverter { ... }

[TestMethod]
public void TestMethod1()
{
    var mock = new MockedConverter();

    var expected = ...;
    var actual = mock.ConvertBack(...);

    Assert.AreEqual(expected, actual);
}

我希望养成使用Moq的习惯。 我不确定如何使用Moq来测试我的抽象类的默认返回值。 这里有什么建议吗?


模拟抽象类就像模拟接口一样简单明了。 - Bala R
2个回答

32
如果将CallBase设置为true,则会调用基类实现。
var mock = new Mock<MyConverter> { CallBase = true };

请查看快速入门中的“自定义模拟行为”部分。

如果没有期望覆盖成员,则调用基类实现(在Rhino Mocks中称为“部分模拟”):默认值为false。


4
如果您只想针对单个类成员(而不是整个模拟类的所有成员)进行设置,您可以将属性 CallBase 设为 false,并改为使用方法 CallBase,如下所示:mock.Setup(x => x.ConvertBack(...)).CallBase();。后者也可与 Strict 模拟一起使用。 - Jeppe Stig Nielsen

6
您可以像在接口上设置Mock一样,在抽象类上设置Mock。为了测试抽象实现,您需要设置Mock对象以调用基本方法来处理未定义的任何函数:
var mock = new Mock<MyConverter>();
mock.CallBase = true;
Assert.AreEqual(expected value,mock.Object.ConvertBack(...));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接