【问题标题】:Verify method was called on returned mock在返回的模拟上调用了验证方法
【发布时间】:2013-09-23 09:46:21
【问题描述】:

我正在使用Moq 对我的工厂进行单元测试,并随后执行它的产品。

我有一个ParameterAlgorithmFactory(返回算法以将报告参数计算为IVisibilityParameterAlgorithm)和一个在工厂内调用Execute() 的方法。

为了测试这一点,我编写了一个单元测试,如下所示:

//Verfiy that execute is called on all algorithms produced by factory
[TestMethod]
public void ParameterAlgorithmFactory_ReturnedAlgorithm_ExpectExceuteCalled()
{
    var mockFactory = new Mock<IParameterAlgorithmFactory>();
    var parameterAlgorithm = new Mock<IVisibilityParameterAlgorithm>();

    mockFactory.Setup(x => x.Create(LineType.Adjustment)).Returns(parameterAlgorithm.Object);

    new ReportParameters().CreateParameters(new DataSet(), mockFactory.Object);

    parameterAlgorithm.Verify(x=> x.Execute(new DataSet()));
 }

如您所见,我正在从我的模拟工厂返回一个模拟算法 (parameterAlgorithm),然后我想验证它是否调用了 Execute()

但是我总是得到:

Moq.MockException:预期至少在模拟上调用一次,但是 从未执行过:x => x.Execute(new DataSet())

尽管我可以调试并看到Execute()ed 的行。

也许我在工厂里做的太多(返回一个算法并执行它),或者我以错误的方式使用 Moq?

非常感谢任何有关此测试失败原因的反馈。

【问题讨论】:

  • 您可能应该使用It.IsAny&lt;DataSet&gt;() 而不是new DataSet() - 验证可能对参数使用引用相等而不是“类型”/存根相等。
  • 可以提供ReportParameters.CreateParameters的详细信息吗?你确定你用LineType.Adjustment作为参数调用Create吗?
  • @PatrykĆwiek - 看起来It.IsAny&lt;DataSet&gt;() 成功了!我会阅读这方面的内容,以便将来理解和使用。如果你想写这个作为答案,我会接受。
  • @m.edmondson 完成! :)

标签: c# .net unit-testing mocking moq


【解决方案1】:

正如我在cmets中提到的,您应该使用It.IsAny&lt;DataSet&gt;()而不是new DataSet()作为验证参数。

似乎 Moq 比较的是参考而不是“类型”,因此您最终会遇到验证失败的情况。如果您只需要一个存根参数,It.IsAny&lt;DataSet&gt;() 正是在这里应该使用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2012-09-07
    相关资源
    最近更新 更多