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

Jos*_*eld 1 c# moq mocking

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)
            )));
Run Code Online (Sandbox Code Playgroud)

模拟上的预期调用至少一次,但从未执行过:

这里的基本问题是我只是失败了,但我不知道具体是什么失败/未正确设置,因为它可能是上述5个条件中的任何一个.

我想分别检查上面的每个条件.有没有一种灵活的方式来使用Moq而不创建多个测试?我认为能够捕获传递给mock的参数然后测试它会很好,但是我还没有找到一种优雅的方法来做到这一点.

Mar*_*ers 5

从本质上讲,您要求的是内部lambda执行一系列断言而不是简单地求值为布尔值.

所以,让我们这样做:)

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;     
   }
)));
Run Code Online (Sandbox Code Playgroud)

您可以将断言移动到单独的方法以获得清晰度.

如果你想摆脱"回归真实"; 你可以为Action <T>编写一个包装器,它返回一个总是返回true的Func <T,bool>.这样你就可以写下以下内容:

saveThemeAS.Verify(service => service.Execute(FakeUserID, It.Is<LayoutENT.Theme>(ReturnsTrue(CheckTheme))))
Run Code Online (Sandbox Code Playgroud)