web-dev-qa-db-ja.com

オブジェクトパラメーターを使用した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");
        }
    );

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

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

68
rhughes

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

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

Verifynew 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)));
_
109