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

mic*_*ael 16 c# abstract-class unit-testing moq mocking

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*ata 25

如果设置CallBase为true,它将调用基类实现.

var mock = new Mock<MyConverter> { CallBase = true };
Run Code Online (Sandbox Code Playgroud)

自定义模拟行为 自定义快速入门的模拟行为部分.

如果没有期望覆盖成员(在Rhino Mocks中称为"Partial Mocks"),则调用基类实现:default为false.

  • 如果你只想要一个类成员(不是整个模拟类的所有成员),你可以将_property_`CallBase`保留为false,并使用_method_`CallBase`代替,如下所示:`mock.Setup(x => x.ConvertBack(...)).CallBase();`.后者也可以与`Strict`模拟一起使用. (3认同)

小智 5

您可以像在接口上一样在抽象类上设置Mock.为了测试抽象实现,您需要设置模拟对象以调用未定义的任何函数的基本方法:

var mock = new Mock<MyConverter>();
mock.CallBase = true;
Assert.AreEqual(expected value,mock.Object.ConvertBack(...));
Run Code Online (Sandbox Code Playgroud)