Moq перевірити за допомогою параметра об’єкта


86

Я намагаюся перевірити параметр, який є класом. Код, що перевіряється, чудовий. Помилка в тесті.

Я спробував два методи, обидва з яких не вдалися.

Ось мої спроби:

1:

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

Це завжди не вдається, навіть якщо об’єкт, переданий як другий параметр, має рівні властивості. Перший параметр перевірено нормально.

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

Це завжди проходить, навіть коли воно повинно провалитися. Затвердження у зворотному виклику не вдаються, але виняток не передається зовнішньому контексту, і тому тест завжди проходить.

Чи можете ви допомогти мені зрозуміти, що я роблю не так?

Відповіді:


138

Перша спроба наближається до того, чого ви хочете досягти.

Причина його невдачі полягає в тому, що Moq (ймовірно) використовує Object.Equalsпід кришкою, щоб перевірити, чи ImageFilterOptionsпараметр, з яким викликаний метод, є таким самим екземпляром, як той, який ви вказали у виклику Verify.

Для них неможливо бути однаковим екземпляром, тому що у Verifyвас створюється файл new ImageFilterOptions().

Замість того, щоб виконувати перевірку параметрів таким чином, ви можете використовувати It.Isсинтаксис Moq, щоб надати вираз, який підтверджує, що параметр є очікуваним.

У вашому випадку ви хочете перевірити, чи параметр має тип, ImageFilterOptionsі як для, так Widthі для Heightвстановлено значення 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?
Тім Абелл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.