繁体   English   中英

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

[英]How to use moq to test a concrete method in an abstract class?

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

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

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

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

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

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

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

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

您是否阅读过Moq的任何入门指南? 这很简单:

var mock = new Mock<MyConverter>();
var expected = ...;
mock.Setup(m => m.ConvertBack(...)).Returns(expected);
var actual = m.Object.ConvertBack(...);
Assert.AreEqual(expected, actual);

但是,当然,这是一个很糟糕的例子,因为你实际上并没有允许它测试任何真正的类。 模拟对于为要进行单元测试的实际类提供模拟非常有用,并且您期望将模拟调用您已模拟的方法。

更新

在再次阅读你的问题后(​​Anthony Pegram更新了标题),我想知道你是否试图通过模拟Convert的实现来测试ConvertBack的真实实现。 如果是这种情况,我有几点意见:

  1. ConvertBack可能不应该被声明为virtual ,至少为了这个例子,
  2. 您可能希望重构代码,以便ConvertConvertBack成为不同服务的一部分:我感觉到可能由于缺乏关注点而产生的代码气味。

如果您确定需要这样做,它应该仍然相对简单:

var mock = new Mock<MyConverter>() {CallBase = true}; // hat tip: adrift
mock.Setup(m => m.Convert(...)).Returns(...);
var expected = ...;
var actual = m.Object.ConvertBack(...);
Assert.AreEqual(expected, actual);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM