Moqはオブジェクトパラメータで検証します


86

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

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

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

私が間違っていることを見つけるのを手伝ってくれませんか?

回答:


139

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

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

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

1
私が使用しなければならなかった構文は次のようになります:It.Is((ImageFilterOptions p) => p.Width == 256 && p.Height == 256)。ジェネリックはありませんでしたIs
スタニスラフ

1
汎用バージョンは私のために機能し、APIドキュメントnudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue)にあります-古いバージョンのMoqを使用していますか?
ティム・アベル2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.