2012-11-21 12 views
42

クラスであるパラメータを確認しようとしています。テストされているコードは問題ありません。バグはテスト中です。オブジェクトパラメータでMoq検証

私は2つの方法を試しましたが、どちらも失敗しました。ここで

は私の試みです:

1:

this.MockImageResizeFilter.Verify(m => m.Filter(this.UploadedFileData, new ImageFilterOptions() 
    { 
     Width = 256, 
     Height = 256, 
    })); 

これは常に2番目のパラメータとして渡されたオブジェクトが等しい特性を有しているにもかかわらず、失敗します。最初のパラメータは正常に検証されます。

2:

this.MockImageResizeFilter.Setup(m => m.Filter(It.IsAny<byte[]>(), It.IsAny<ImageFilterOptions>())) 
    .Callback<byte[], ImageFilterOptions>((data, options) => 
     { 
      Assert.AreEqual(this.UploadedFileData, data, "data"); 
      Assert.AreEqual(filterOptions.Width, options.Width, "Width"); 
      Assert.AreEqual(filterOptions.Height, options.Height, "Height"); 
     } 
    ); 

これは、常にそれが失敗した場合でも、渡します。コールバックのAssertは失敗しますが、例外は外部コンテキストに渡されないため、テストは常に成功します。

私が間違っていることを見つけるのを助けることができますか?

答えて

66

最初の試みは、達成したいことに近いです。

それが失敗した理由は、部品番号は、(おそらく)メソッドが呼び出されましたImageFilterOptionsパラメータは、あなたがVerifyへの呼び出しで供給されるものと同じインスタンスであるかどうかをテストするためにカバーの下Object.Equalsを使用していることです。

Verifyではnew ImageFilterOptions()を作成するため、同じインスタンスにすることはできません。

このようにパラメータチェックを実行する代わりに、MoqのIt.Is構文を使用して、パラメータが期待どおりであることを確認する式を指定できます。

場合によっては、パラメータのタイプがImageFilterOptionsで、WidthHeightの両方が256に設定されていることを確認する必要があります。あなたがそれを行うことができます式は次のとおりです。

It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256) 

ので、Verifyへのお電話は、次のようになります。

this.MockImageResizeFilter.Verify(m => m.Filter(
      this.UploadedFileData, 
      It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256))); 
+0

スポット、おかげで! – rhughes

+1

私が使用しなければならない構文は 'It.Is((ImageFilterOptions p)=> p.Width == 256 && p.Height == 256)'です。一般的なものはありませんでした – Nemo1024

+0

ジェネリック版は私のために働き、API文書http://www.nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue)にありますか?旧バージョンのMoqを使用していますか? –

関連する問題