Как проверить, что метод не был вызван в Moq?

Как проверить, что метод НЕ был вызван в Moq?

Есть ли что-то вроде AssertWasNotCalled?

UPDATE: начиная с версии 3.0 можно использовать новый синтаксис:

mock.Verify(foo => foo.Execute("ping"), Times.Never());

Ответ 1

ОБНОВЛЕНИЕ. Начиная с версии 3, проверьте обновление до вопроса выше или ответ Данна ниже.

Либо сделайте свой макет строгим, чтобы он не сработал, если вы вызываете метод, для которого вы не ожидаете

new Mock<IMoq>(MockBehavior.Strict)

Или, если вы хотите, чтобы ваш макет был свободным, используйте .Throws(Exception)

var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));

Ответ 2

Запустите проверку после теста, который имеет набор Times.Never enum. например.

_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());

Ответ 3

Украден из: Джон Фостер отвечает на вопрос: "Нужна помощь, чтобы лучше понять Moq"

Одна из вещей, которые вы можете протестировать, заключается в том, что метод оплаты не вызывается, когда лицо в возрасте старше 65 лет переходит в Метод

[Test]
public void Someone_over_65_does_not_pay_a_pension_contribution() {
    Mock<IPensionService> mockPensionService = new Mock<IPensionService>();
    Person p = new Person("test", 66);
    PensionCalculator calc = new PensionCalculator(mockPensionService.Object);
    calc.PayPensionContribution(p);
    mockPensionService.Verify(ps => ps.Pay(It.IsAny<decimal>()), Times.Never());
}

Ответ 4

Это не работает в последних версиях Moq (начиная с по крайней мере 3.1), оно должно быть указано в методе Verify, как указано в Ответ.

На самом деле лучше указать .AtMost(0) после оператора Returns.

var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);

Хотя "броски" также работают, AtMost(0) более выразительно ИМХО.

Ответ 5

Используйте .AtMostOnce();

После реального теста снова вызовите метод. Если он выдает исключение, он вызывается.