c# - 干净地验证传递给 Mock 的参数的许多属性 [单独在单个验证调用之外]?

标签 c# mocking moq

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 编写一个包装器,它返回一个始终返回 true 的 Func。这样你就可以按照以下方式写一些东西:

saveThemeAS.Verify(service => service.Execute(FakeUserID, It.Is<LayoutENT.Theme>(ReturnsTrue(CheckTheme))))

关于c# - 干净地验证传递给 Mock 的参数的许多属性 [单独在单个验证调用之外]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11511550/

相关文章:

c# - 如何使用 protobuf-net 序列化/反序列化锯齿状/嵌套数组?

c# - Web Api 变量参数

c# - 如何在 Windows 资源管理器工具栏中创建自定义按钮

java - 如何在运行 junit 测试用例时避免实际的方法调用

c# - Moq:从通用接口(interface)继承的模拟接口(interface)

c# - Java 或 .Net 应用程序是否严重依赖反射?

java - mockito 是否具有与 jMock 的状态等效的成语?

java - 用于 JUnit 测试的模拟对象

c# - 是否可以在 Moq 返回的对象上设置属性?

c# - 如何验证 Moq 中的对象类型参数