Відповіді:
ОНОВЛЕННЯ : Починаючи з версії 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)
IMHO є більш виразним.
Використовуйте .AtMostOnce ();
Після реального тестування знову зателефонуйте до методу. Якщо він кидає виняток, його називали.