Antworten:
UPDATE : Überprüfen Sie seit Version 3 das Update der obigen Frage oder die Antwort von Dann unten.
Machen Sie Ihren Mock entweder streng, damit er fehlschlägt, wenn Sie eine Methode aufrufen, für die Sie keine Erwartungen haben
new Mock<IMoq>(MockBehavior.Strict)
Oder wenn Sie möchten, dass Ihr Mock locker ist, verwenden Sie die .Throws (Ausnahme)
var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));
Führen Sie nach dem Test eine Überprüfung durch, für die eine Times.Never
Aufzählung festgelegt wurde. z.B
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());
Gestohlen von: John Fosters Antwort auf die Frage "Brauchen Sie Hilfe, um Moq besser zu verstehen?"
Eines der Dinge, die Sie möglicherweise testen möchten, ist, dass die Zahlungsmethode nicht aufgerufen wird, wenn eine Person über 65 in die Methode übernommen wird
[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()); }
Dies funktioniert in neueren Versionen von Moq nicht (seit mindestens 3.1). Es sollte in der
Verify
in der Antwort genannten Methode angegeben werden.
Eigentlich ist es besser, .AtMost(0)
nach der Returns-Anweisung anzugeben .
var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
Obwohl die "Würfe" auch funktionieren, AtMost(0)
ist IMHO ausdrucksvoller.
Verwenden Sie .AtMostOnce ();
Rufen Sie die Methode nach dem eigentlichen Test erneut auf. Wenn es eine Ausnahme auslöst, wurde es aufgerufen.