559 Stimmen

Wie kann man überprüfen, dass die Methode NICHT in Moq aufgerufen wurde?

Wie kann ich überprüfen, dass die Methode NICHT in Moq ?

Verfügt es über etwas wie AssertWasNotCalled?

UPDATE: Ab der Version 3.0 kann eine neue Syntax verwendet werden:

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

0 Stimmen

Ab v4.8 gibt es eine alternativer Ansatz das ist auch eine Überlegung wert.

661voto

Dan Punkte 12148

Führen Sie nach dem Test ein Verify mit der Option Times.Never() Option.

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

170voto

Dan Fish Punkte 2352

UPDATE : Seit Version 3, siehe die Aktualisierung der Frage oben oder Dann's Antwort unten.

Entweder, machen Sie Ihre mock streng, so dass es fehlschlägt, wenn Sie eine Methode aufrufen, für die Sie nicht eine erwarten

new Mock<IMoq>(MockBehavior.Strict)

Oder, wenn Sie wollen, dass Ihr Mock locker ist, verwenden Sie die .Throws( Exception )

var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));

57voto

Chris Marisic Punkte 31583

Gestohlen von: John Fosters Antwort auf die Frage "Brauche Hilfe, um Moq besser zu verstehen"

Sie sollten unter anderem testen, ob die Zahlungsmethode nicht aufgerufen wird, wenn eine Person über 65 Jahren in die Methode

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

12voto

miha Punkte 3187

Dies funktioniert in neueren Versionen von Moq nicht mehr (mindestens seit 3.1), sollte sie in der Datei Verify Methode, wie sie in der Antwort.

Eigentlich ist es besser, Folgendes anzugeben .AtMost(0) nach der Anweisung Returns.

var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);

Obwohl die "Würfe" auch funktionieren, AtMost(0) ist IMHO ausdrucksstärker.

8voto

MarredCheese Punkte 13018

Verwendung von VerifyNoOtherCalls (erfordert Moq 4.8 oder höher)

Diese Antwort ist ein indirekter Ansatz. Anstatt zu prüfen, dass eine bestimmte Methode nicht aufgerufen wurde, prüfen Sie, dass keine unerwarteten Aufrufe im Allgemeinen gemacht wurden.

Bedenken Sie, dass ein gründlicher Test einer Attrappe 2 Dinge bewirkt:

  1. Überprüfen Sie, ob alle erwarteten Anrufe getätigt wurden.
  2. Überprüfen Sie, dass keine unerwarteten Anrufe getätigt wurden.

Wenn Sie Schritt 1 bereits ausführen, ist Schritt 2 trivial:

// Step 1 (if relevant - see note below)
mock.Verify(..., Times.Exactly(2));
mock.Verify(..., Times.Once());
// ...

// Step 2
mock.VerifyNoOtherCalls();

Anmerkungen

  • Wenn Sie Schritt 1 auslassen, stellt Schritt 2 einfach sicher, dass keine Anrufe an den Mock getätigt wurden.
  • Dies erfordert keine strenge Nachahmung.
  • Quelle: Moq Schnellstart

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X