1
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)
            )));

モックでの呼び出しが少なくとも1回は期待されていましたが、実行されませんでした。

ここでの基本的な問題は、失敗するだけですが、上記の5つの条件のいずれかである可能性があるため、具体的に何が失敗したか、何が適切に設定されなかったかはわかりません。

上記の各条件を個別に確認したいと思います。複数のテストを作成せずにMoqでこれを行うための巧妙な方法はありますか?モックに渡された議論をキャプチャしてそれに対してテストできるといいと思いましたが、それを行うためのエレガントな方法を見つけることができませんでした。

4

2 に答える 2

5

本質的に、あなたが求めているのは、単にブール値に評価するのではなく、内部ラムダが一連のアサーションを実行することです。

だから、まさにそれをしましょう:)

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;     
   }
)));

明確にするために、アサーションを別のメソッドに移動できます。

「trueを返す」を取り除きたい場合。常にtrueを返すFunc<T、bool>を返すAction<T>のラッパーを作成できます。そうすれば、次のように書くことができます。

saveThemeAS.Verify(service => service.Execute(FakeUserID, It.Is<LayoutENT.Theme>(ReturnsTrue(CheckTheme))))
于 2012-07-16T20:05:37.643 に答える
1

この問題への私のアプローチは、コールバックが渡されたsavedThemeオブジェクトのコピーを保存するように、モックセットアップでコールバックを使用することだと思います。次に、単体テストの後半でアサートを実行します。これにより、トリプルA(アレンジ、アクト、アサート)パターンが保持され、アサーションロジックをモックセットアップに配置するよりもクリーンに見えます。したがって、たとえば:

protected static LayoutENT.Theme savedTheme;
// Arrange
themeParam = null;
saveThemeAS.Setup(service => service.Execute(FakeUserID, It.Is<LayoutENT.Theme>)
    .Callback<layoutENT.Theme>(p =>  savedTheme = p);

// Act
// Calls the subject under test

// Assert
Assert.IsNotNull(savedTheme); 
Assert.AreEqual(FakeCopiedThemeName, savedTheme.Name); 
Assert.AreEqual(0, savedTheme.ThemeID) 

等...

于 2012-07-17T23:15:44.320 に答える