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

Это всегда проходит, даже если не получается. Утверждения в обратном вызове терпят неудачу, но исключение не передается во внешний контекст, и поэтому тест всегда проходит.

Можете ли вы помочь мне найти, что я делаю не так?

Rhughes
источник

Ответы:

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?
Tim Abell