Jak sprawdzić, czy ta metoda NIE została wywołana w Moq?


466

Jak sprawdzić, czy ta metoda NIE została wywołana w Moq ?

Czy ma coś takiego jak AssertWasNotCalled?

AKTUALIZACJA: Począwszy od wersji 3.0 można zastosować nową składnię:

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

Odpowiedzi:


155

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."));

9
... lub Callback (), aby ustawić flagę, którą można potwierdzić.
alex

2
Również z opcją # 2 nie można mieć VerifyAll w ogólnej metodzie Teardown - nie powie, że oczekiwanie nie zostało spełnione; kiedy test powinien idealnie przejść.
Gishu,

51
To nie jest tak naprawdę „weryfikacja nie wywołana”, ponieważ może zostać złapana w ramach metody i nadal będzie działać - zapewniając fałszywie dodatni!
Dan

4
Oczekiwanie jest teraz przestarzałe
Tomasz Sikora

5
Być może był to najlepszy możliwy sposób w 2009 r., Ale na pewno nie teraz. przepraszam
Fabio Milheiro,

537

Uruchom weryfikację po teście, który ma Times.Neverzestaw wyliczeń. na przykład

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

4
Najważniejsze w tym przypadku jest to, że wywołanie Verify (akcja, Nigdy) następuje po wywołaniu mock. Myślałem, że to konfiguracja do późniejszego wywołania VerifyAll () (co nie działa)
piers7

Prosty i skuteczny. Dzięki.
Ian Grainger

45

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());
}

10

Nie działa to w najnowszych wersjach Moq (od co najmniej 3.1), należy to określić w Verifymetodzie, 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.


-5

Użyj .AtMostOnce ();

Po prawdziwym teście ponownie wywołaj metodę Jeśli zgłasza wyjątek, został wywołany.


1
Czy to nie jest zbyt niejasne, aby stwierdzić, że wyjątek został zgłoszony przez kpiące środowisko?
alex

Dlaczego? Po prostu sprawdź typ wyjątku. Jeśli ktoś rzuci mój Moq, jesteś bezpieczny.
Aaron Digulla

8
Korzystanie z Verify w Timesie. Nigdy nie jest lepszym wyborem ... Zgadzam się z Alexem, że to rozwiązanie działa, ale zdecydowanie jest niejasne.
Sygnał dźwiękowy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.