101

クラスであるパラメーターを検証しようとしています。テスト中のコードは問題ありません。バグはテスト中です。

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

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

私が間違っていることを見つけるのを手伝ってもらえますか?

4

2 に答える 2

171

最初の試みは、あなたが達成したいものにより近いものです。

失敗する理由は、メソッドが呼び出されたパラメーターが への呼び出しで指定したものと同じインスタンスであるObject.Equalsかどうかをテストする ために、Moq が (おそらく) カバーの下で使用するためです。ImageFilterOptionsVerify

Verifyを作成するため、それらが同じインスタンスになることは不可能ですnew ImageFilterOptions()

この方法でパラメータ チェックを実行する代わりに、Moq のIt.Is構文を使用して、パラメータが期待どおりであることを検証する式を提供できます。

あなたの場合、パラメータがタイプであり、と のImageFilterOptions両方が に設定されていることを確認したいと考えています。それを可能にする式は次のとおりです。WidthHeight256

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)));
于 2012-11-21T15:30:49.307 に答える