Почему в Моке нет Времен. - PullRequest
6 голосов
/ 17 января 2012

С помощью Moq можно проверить, что метод никогда не вызывается с определенными аргументами (то есть аргументами, удовлетворяющими определенным предикатам), используя Times.Never.

Но как проверитьчто, независимо от того, сколько раз вызывается метод, он всегда вызывается с определенными аргументами?

По умолчанию это Times.AtLeastOnce.

НетTimes.Always.Я что-то упускаю из виду?Спасибо!

Редактировать. На прошлой неделе я разместил предложение в списке рассылки Moq, но, похоже, его еще не модерировали.Я буду публиковать любые обновления здесь.

Редактировать: пример.Скажем, я тестирую класс, который генерирует XML-документы.Я хочу убедиться, что генерируются только действительные документы.Другими словами, проверьте, чтобы зависимость писателя была только когда-либо при наличии правильных документов с действительным порядковым номером для записи.

should_only_write_valid_xml_documents

Mock.Get(this.writer).Verify(
    w => w.Write(
        It.Is<XDocument>(doc => XsdValidator.IsValid(doc)),
        It.Is<int>(n => n < 3)),
    Times.Always);

Ответы [ 4 ]

8 голосов
/ 17 января 2012

А сколько раз "всегда"? Moq отслеживает все случаи, когда определенный метод вызывается с определенными аргументами, а затем использует это число для сравнения с Times.Never, Times.AtLeastOnce и т. Д.

Итак, если метод выполняется 4 раза и вы устанавливаете его в «Times.Always», что это вообще значит?

Время. Никогда не проверяйте, чтобы число было нулевым.

Times.AtLeastOnce будет проверять, что число больше или равно единице.

Время. Всегда проверял бы, что число ....?

Вы можете определить, сколько раз он ДОЛЖЕН работать программно, а затем сделать что-то вроде:

Times.Exactly(calculatedAmount)

Но Мок не может знать, что означает «всегда».

3 голосов
/ 17 января 2012

Звучит так, будто вы хотите "Строгого" насмешливого поведения. Если метод вызывается с чем-либо, кроме ожидаемых параметров, тест не пройден.

Это доступно в Moq:

var mock = new Mock<IFoo>(MockBehavior.Strict);

(Пример взят из Moq QuickStart .)

Каждый вызов на макете должен теперь иметь соответствующий Setup.

Использование строгих издевательств ведет к хрупким испытаниям. Я бы избегал этой техники или, по крайней мере, использовал бы ее экономно.

2 голосов
/ 18 января 2012

Вы можете применить инверсию логики для проверки ВСЕГДА.

Например:

Допустим, вы хотите выполнить следующую проверку:

mock.Verify(x => x.Method(It.Is<int>(i => i == 10)), Times.Always());

вы можете просто заменитьэто с:

mock.Verify(x => x.Method(It.Is<int>(i => i != 10)), Times.Never());
0 голосов
/ 17 января 2012

Я бы порекомендовал создать «запасной вариант» для метода с условиями It.IsAny. Затем вы можете проверить Times.Never для этого соответствия, которое всегда должно было заменяться более конкретным соответствием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...