Verifikasi moq dengan parameter objek

86

Saya mencoba memverifikasi parameter yang merupakan kelas. Kode yang sedang diuji baik-baik saja. Bug sedang dalam pengujian.

Saya telah mencoba dua metode, keduanya gagal.

Inilah usaha saya:

1:

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

Ini selalu gagal, meskipun objek yang dilewatkan sebagai parameter kedua memiliki properti yang sama. Parameter pertama diverifikasi dengan baik.

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

Ini selalu berlalu, bahkan ketika seharusnya gagal. Asserts di callback gagal, tetapi pengecualian tidak diteruskan ke konteks luar, sehingga pengujian selalu berhasil.

Dapatkah Anda membantu saya menemukan kesalahan yang saya lakukan?

rhughes
sumber

Jawaban:

138

Upaya pertama lebih dekat dengan apa yang ingin Anda capai.

Alasan gagal adalah karena Moq (mungkin) menggunakan di Object.Equalsbawah penutup untuk menguji apakah ImageFilterOptionsparameter yang dipanggil dengan metode adalah contoh yang sama dengan yang Anda berikan dalam panggilan ke Verify.

Tidak mungkin mereka menjadi contoh yang sama, karena di dalam VerifyAnda membuat file new ImageFilterOptions().

Alih-alih melakukan pemeriksaan parameter dengan cara ini, Anda dapat menggunakan It.Issintaks Moq untuk memberikan ekspresi yang memverifikasi bahwa parameter adalah yang diharapkan.

Dalam kasus Anda, Anda ingin memeriksa apakah parameternya bertipe ImageFilterOptionsdan bahwa the Widthdan the Heightdisetel ke 256. Ekspresi yang memungkinkan Anda melakukan itu adalah:

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

Jadi, panggilan Anda ke Verifybisa terlihat seperti ini:

this.MockImageResizeFilter.Verify(m => m.Filter(
            this.UploadedFileData,
            It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)));
Cristian Lupascu
sumber
1
Sintaks yang saya harus menggunakan akan menjadi: It.Is((ImageFilterOptions p) => p.Width == 256 && p.Height == 256). Tidak ada generikIs
Stanislav
1
Versi generik bekerja untuk saya dan ada di dokumen API nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue) - apakah Anda menggunakan versi Moq yang kedaluwarsa?
Tim Abell