Odpowiedzi:
AKTUALIZACJA : Od wersji 3 sprawdź aktualizację powyższego pytania lub odpowiedź Danna poniżej.
Albo uczyń swoją próbną surową, aby nie zadziałała, jeśli wywołasz metodę, na którą nie oczekujesz
new Mock<IMoq>(MockBehavior.Strict)
Lub, jeśli chcesz, aby Twój makieta był luźny, skorzystaj z .Throws (wyjątek)
var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));
Uruchom weryfikację po teście, który ma Times.Never
zestaw wyliczeń. na przykład
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());
Skradzione z: Odpowiedź Johna Fostera na pytanie „Potrzebujesz pomocy, aby lepiej zrozumieć Moq”
Jedną z rzeczy, które możesz chcieć przetestować, jest to, że metoda płatności nie jest wywoływana, gdy osoba w wieku powyżej 65 lat zostanie przekazana do tej metody
[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()); }
Nie działa to w najnowszych wersjach Moq (od co najmniej 3.1), należy to określić w
Verify
metodzie, jak wspomniano w odpowiedzi.
W rzeczywistości lepiej jest określić .AtMost(0)
po instrukcji Returns.
var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
Chociaż „rzuty” również działają, AtMost(0)
jest bardziej wyraziste IMHO.
Użyj .AtMostOnce ();
Po prawdziwym teście ponownie wywołaj metodę Jeśli zgłasza wyjątek, został wywołany.