无法验证Moq方法调用

时间:2014-01-30 21:30:32

标签: c# unit-testing tdd moq

使用给定的参数验证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>)

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

1 个答案:

答案 0 :(得分:1)

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

您可能需要Func<IHtmlString,bool>来比较值,而不是实例。您是否可以将p.ToString()(或ToHtmlString())与字符串"</div>"进行比较? Create似乎是额外的工作。

It.Is<T>采用一个函数,说明“给定类型T的记录对象,验证该对象的某些内容”。因此,这扩展到(概念上):

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

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