saveThemeAS.Verify(service => service.Execute(FakeUserID, It.Is<LayoutENT.Theme>(savedTheme =>
savedTheme != null
&& savedTheme.Name == FakeCopiedThemeName
&& savedTheme.ThemeID == 0
&& savedTheme.WidgetSkins.Any(skin => skin.Name == FakeWidgetSkinName && skin.WidgetSkinID == 0)
&& savedTheme.SiteStyles.Any(style => style.SiteStyleID == FakeStyleID && style.SiteStyleID == 0)
)));
Expected invocation on the mock at least once, but was never performed:
这里的基本问题是我刚遇到失败,但我具体不知道是什么失败了/什么设置不当,因为它可能是上述 5 种情况中的任何一种。
我想分别检查上面的每个条件。有没有一种巧妙的方法可以在不创建多个测试的情况下使用最小起订量来做到这一点?我认为能够捕获传递给模拟的参数然后对其进行测试会很好,但我一直无法找到一种优雅的方法来做到这一点。
最佳答案
本质上,您要求的是让您的内部 lambda 执行一系列断言,而不是简单地评估为 bool 值。
那么,让我们来做吧:)
saveThemeAS.Verify(service => service.Execute(FakeUserID, It.Is<LayoutENT.Theme>(savedTheme =>
{
Assert.IsNotNull(savedTheme);
Assert.AreEqual(FakeCopiedThemeName, savedTheme.Name);
Assert.AreEqual(0, savedTheme.ThemeID)
etc...
return true;
}
)));
为了清楚起见,您可以将断言移至单独的方法。
如果你想摆脱“return true;”您可以为 Action
saveThemeAS.Verify(service => service.Execute(FakeUserID, It.Is<LayoutENT.Theme>(ReturnsTrue(CheckTheme))))
关于c# - 干净地验证传递给 Mock 的参数的许多属性 [单独在单个验证调用之外]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11511550/