【问题标题】:How to use moq to test a concrete method in an abstract class?如何使用 moq 测试抽象类中的具体方法?
【发布时间】:2011-10-07 19:09:13
【问题描述】:

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

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 来测试我的抽象类的默认返回值。这里有什么建议吗?

【问题讨论】:

  • 模拟抽象类很像模拟接口。这很简单。

标签: c# unit-testing mocking moq abstract-class


【解决方案1】:

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

var mock = new Mock<MyConverter> { CallBase = true };

请参阅快速入门的 Customizing Mock Behavior Customizing Mock Behaviour 部分。

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

【讨论】:

  • 如果您只希望它用于单个类成员(不是整个模拟类的所有成员),您可以将 property CallBase 保留为 false,并使用方法改为CallBase,像这样:mock.Setup(x =&gt; x.ConvertBack(...)).CallBase();。后者也可以与 Strict 模拟一起使用。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2015-03-20
    • 2011-04-12
    • 1970-01-01
    • 2018-09-23
    • 2013-05-16
    相关资源
    最近更新 更多