Ответы:
ОБНОВЛЕНИЕ : начиная с версии 3, проверьте обновление на вопрос выше или ответ Данна ниже.
Либо сделайте свой макет строгим, чтобы он потерпел неудачу, если вы вызовете метод, для которого вы не ожидаете
new Mock<IMoq>(MockBehavior.Strict)
Или, если вы хотите, чтобы ваш макет был свободным, используйте .Throws (Исключение)
var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));
Запустите проверку после теста, для которого Times.Never
задано перечисление. например
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());
Украдено у: ответ Джона Фостера на вопрос: «Нужна помощь, чтобы лучше понять Мок»
Одной из вещей, которую вы можете захотеть проверить, является то, что метод оплаты не вызывается, когда в метод передается человек старше 65 лет.
[Test] public void Someone_over_65_does_not_pay_a_pension_contribution() { var mockPensionService = new Mock<IPensionService>(); var person = new Person("test", 66); var calc = new PensionCalculator(mockPensionService.Object); calc.PayPensionContribution(person); mockPensionService.Verify(ps => ps.Pay(It.IsAny<decimal>()), Times.Never()); }
Это не работает в последних версиях Moq (начиная с версии 3.1), это должно быть указано в
Verify
методе, как указано в ответе.
На самом деле, это лучше указывать .AtMost(0)
после оператора Returns.
var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
Хотя «броски» тоже работают, AtMost(0)
более выразительно ИМХО.
Используйте .AtMostOnce ();
После реального теста, вызовите метод снова. Если он выдает исключение, он вызывается.