使用给定的参数验证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?
答案 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);
通过使用一些中间操作,您可以对实际和预期的两个不同对象进行操作,并比较一些派生值。