Was ist der Zweck von Verifizierbar () in Moq?


125

Was ist der Zweck von Verifiable()?

Wenn ich a überprüfe Mockund dies weglasse, wird immer noch das überprüft SetUp.

Bearbeiten: Ich habe VerifyAll()also den Grund dafür verwendet, dass alles überprüft wurde. Nach dem Wechsel zu wurden Verify()nur meine .Verifiable() SetUps überprüft.

Antworten:


83

ADDENDUM: Wie in der anderen Antwort angegeben, besteht der Zweck .Verifiabledarin, a Setupin eine Reihe von "zurückgestellten Verify(...)Anrufen" aufzunehmen, die dann über ausgelöst werden können mock.Verify().

Die Klarstellung des OP macht deutlich, dass dies das Ziel war und das einzige Problem darin bestand, herauszufinden, warum es nicht funktionierte, aber wie @Liam sagte, sollte die Antwort auch dies wirklich berühren: - Die wichtigsten Anwendungsfälle, soweit ich kann siehe sind:

  • Aufrechterhaltung der Trockenheit zwischen a mock.Setup()undmock.Verify
  • Ermöglichen, dass die Konfiguration einer Überprüfung vom eigentlichen VerifyAufruf selbst getrennt wird (z. B. können Sie sie in einer anderen Hilfsmethode einrichten).

... und zurück zu meiner Antwort, in der knapp gesagt wird: "Seien Sie vorsichtig, da die oben genannten Profis häufig als überwogen angesehen werden, wenn das Erreichen dieser Ziele die Lesbarkeit und Wartbarkeit von Tests beeinflusst, die sich zu sehr auf solche Konstrukte stützen."

ORIGINAL: Beachten Sie, dass man, wo immer möglich, stattdessen dem AAA- Layout folgen sollte und daher nach Abschluss der Arbeit explizite mock.Verify( expression )Anrufe tätigenmock.Setup( ... ).Verifiable()mock.Verify()mock.VerifyAll() sollte , anstatt mit einem oder wo immer möglich gepaart zu werden (Kredit: @kzu ).


7
@EricSmith Rückblickend denke ich nicht, dass ich es stark genug ausgedrückt habe. Die Aufteilung Ihrer Arbeit in AAA-Bündelungen bietet massiv mehr Vorteile als die Überkonzentration auf Gemeinsamkeiten zwischen der Arrangier- und der Assert-Phase. In 90% der Fälle kann man etwas aus den Nuancen gewinnen, mit denen Sie die Überprüfungsaufrufe am Ende ausdrücken. Daher sollten Sie sich viel Zeit nehmen, um dies zu optimieren, auch wenn dies in einigen Fällen als schmerzhafte Doppelarbeit erscheint. Einer der Punkte, die manning.com/osherove sehr gut macht, ist, dass es wichtig ist, einen Test für jemanden sinnvoll zu machen, der hineinspringt - also halten Sie sich an die Konvention!
Ruben Bartelink

3
Normalerweise bin ich nicht derjenige, der gegen den Strich akzeptierter Weisheit verstößt, aber ich bin noch nicht überzeugt von den Vorteilen von AAA gegenüber Verifyable()/ VerifyAll()in allen Fällen. Mein aktueller Unit-Test hat eine große Anzahl von Setup(...)Anrufen (> 30). Könnte jedes mit einem äquivalenten Verify () abgleichen, um die Konvention zu erfüllen, aber dies führt zu einer großen Menge an Codeduplizierungen und ist schwieriger zu warten und zu lesen, wenn die Anzahl der Komponententests zunimmt. Ich denke, was ich wirklich frage, ist, ob Ausnahmen gemacht werden können, wenn es eine große Anzahl von Setups gibt, oder ob die Vermeidung Verifiable()einer festen Regel ist?
Steve Chambers

5
@SteveChambers Ein Schlüsselelement von AAA ist, dass es nicht A * ist - es sollte einen einzigen Akt und einen einzigen Assert geben. Während Sie also technisch korrekt sagen, dass es weniger Code für Sie ist, werden die Zufälle, welche Ihrer Setups für welche (Unter-) Handlungen und (Unter-) Behauptungen gelten, ausnahmslos zu einem Minenfeld. Also nein, es ist nicht schwer und schnell, aber ich würde sagen, dass es ein sehr schlechter Rat wäre, zu behaupten, dass es sogar nahe an 50:50 liegt. (Beachten Sie auch, dass Sie kein Setup durchführen müssen, um eine Überprüfung durchzuführen, es sei denn, Sie versuchen, ein bestimmtes Verhalten während des Gesetzes einzuführen - was ein weiteres Element klarer Tests ist.)
Ruben Bartelink

1
@Liam Und es ist in der Tat völlig in Ordnung, dass Sie immer noch davon überzeugt sind, dass es ein geeignetes Werkzeug für Ihren Job ist - mein eigentlicher Punkt ist nur, dass es als allgemeiner Ansatz zum Schreiben von Tests mit Mocks verpönt ist - dh trotz der Tatsache, dass es ordentlich DRYness erreicht zwischen a Setupund a Verify, bei denen möglicherweise ein höherer erreichbarer Gewinn fehlt, kann nur die DRY-Beschränkung auf die von AAA vorgeschlagene Weise und die stark implizierte Strategiefamilie gelockert werden
Ruben Bartelink,

1
@ Liam Danke für das Anstupsen; Ich habe meine Antwort aktualisiert, weil Sie in dem Punkt, den Sie machen, richtig sind. Damals, als ich SO-Fragen wie diese beantwortete, bestand meine Ansicht im Allgemeinen darin, kurz und bündig eine atomare Antwort anzugeben und dann konkurrierende Antworten wie die andere die Karte ausfüllen zu lassen. In diesen Tagen (wenn ich mir noch die Zeit genommen hätte, Fragen zu beantworten) würde ich wahrscheinlich versuchen, die vollständigere Antwort zu geben, die dies in erster Linie geworden ist.
Ruben Bartelink

54

Wenn die Verify()Methode am Ende des Tests aufgerufen wird und eine der als überprüfbar gekennzeichneten Erwartungen nicht aufgerufen wurde, liegt eine Ausnahme vor thrown.

VerifyAll() prüft nicht auf nachprüfbare Erwartungen.


Würde es Ihnen etwas ausmachen, etwas mehr über VerifyAll () zu erklären, das nicht nach überprüfbaren Erwartungen sucht?
JW

@JW Dies bedeutet, dass VerifyAll alle Setups überprüft, ohne zu berücksichtigen, ob sie als überprüfbare Erwartungen markiert wurden.
Phoog
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.