【问题标题】:Can't verify Moq method call无法验证 Moq 方法调用
【发布时间】:2014-01-30 21:30:32
【问题描述】:

使用给定参数验证 TextWriter Write 方法调用时出现问题。我有这个验证码:

_htmlHelperMock.TextWritterMock.Verify(x => x.Write(It.Is<IHtmlString>(p => p == MvcHtmlString.Create("</div>"))), Times.Once);

抛出此异常:

Expected invocation on the mock once, but was 0 times: x => x.Write(It.Is<IHtmlString>(p => p == MvcHtmlString.Create("</div>")))  
No setups configured.

Performed invocations:  
TextWriter.Write(<div class="control-group">)  
TextWriter.Write(</div>)

有趣的是,在异常中我看到了我想要检查的字符串的真正调用。 我应该如何配置验证方法来检查参数?

【问题讨论】:

  • @marc_s,抱歉,您的编辑删除了一些必要信息,我必须恢复您的编辑

标签: c# unit-testing tdd moq


【解决方案1】:

当您使用It.Is&lt;IHtmlString&gt;(p =&gt; p == MvcHtmlString.Create("&lt;/div&gt;")) 进行验证时(在我不了解MvcHtmlString 的情况下,很明显这将失败)。无论您在测试期间调用什么,都将是 Create 返回的不同对象。在这个Verify 中,它将两个实例与== 进行比较。这些将是对象引用相等。

您可能想要一个比较值的Func&lt;IHtmlString,bool&gt;,而不是实例。您能否将p.ToString()(或ToHtmlString())与简单的字符串"&lt;/div&gt;" 进行比较? Create 似乎是额外的工作。

It.Is&lt;T&gt; 接受一个函数,上面写着“给定T 类型的记录对象,验证有关该对象的某些内容”。所以,这扩展为(概念上):

IHtmlString actual = theRecordedParameter;
IHtmlString expected = MvcHtmlString.Create("</div>");
bool pass = actual == expected;
Assert.IsTrue(pass);

通过使用一些中间操作,您可以对实际和预期的两个不同对象进行操作,并比较一些派生值。

【讨论】:

  • 谢谢。您的回答帮助我解决了这个问题。将 p.ToString() 与给定的字符串进行比较就足够了,它是有效的。 _htmlHelperMock.TextWritterMock.Verify(x => x.Write(It.Is(p => p.ToString() == "
    ")), Times.Once);
  • msi,很高兴你成功了。
  • 猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 2011-03-11
    • 2018-10-26
    • 1970-01-01
    • 2011-10-02
    • 2013-01-01
    • 2016-06-12
    • 1970-01-01
    相关资源
    最近更新 更多