2009-06-11 3 views
87

Was ist der Zweck von Verifiable()?Was ist der Zweck von verifizierbar() in Moq?

Wenn ich eine Mock verifiziere und dies auslasse, überprüft es immer noch die SetUp.

Bearbeiten: Ich war mit VerifyAll() also der Grund für alles wird überprüft. Nach dem Wechsel zu Verify() wurden nur meine .Verifiable()SetUp s geprüft.

Antwort

57

NACHTRAG: Wie die anderen Antwort Staaten, der Zweck der .Verifiable ist ein Setup in einen Satz von „latenten Verify(...) Anrufen“ zu gewinnen, die dann über mock.Verify() ausgelöst werden können.

Klärung Die OPs macht deutlich, dass dies das Ziel und das einzige Problem war, herauszufinden, warum es nicht funktioniert, sondern als @Liam angestachelt, berühren Sie die Antwort sollte wirklich auf diesem zu: - Der Schlüssel Nutzung Fälle wie weit kann ich sehen, sind:

  • Trockenheit zwischen einem mock.Setup() und mock.Verify
  • Aufrechterhaltung eines ermöglicht das Konfigurieren einer Überprüfung der tatsächlichen Verify Anruf selbst (zB zu trennen, können Sie es in einem anderen Satz könnte Hilfsmethode)

... und zurück zu meiner Antwort, die lapidar sagt: "Sei vorsichtig, denn die oben genannten Vorteile werden oft dadurch aufgewogen, dass diese Ziele auf die Lesbarkeit und Wartbarkeit von Tests, die zu sehr lasten, zurückzuführen sind solche Konstrukte“

ORIGINAL: Beachten Sie, dass dort möglich, wo sollte man stattdessen das AAA Layout folgen und somit sollte man doing explicit mock.Verify(expression) calls after the work has been done, rather than a mock.Setup(...).Verifiable() paired with a mock.Verify() or mock.VerifyAll() wo immer möglich (Kredit: @kzu) sein.

+0

Um zu klären - Wenn ich einen Mock brauche, um etwas an den zu testenden Code zurückzugeben, ist das ein Fall, wo 'Setup (...)' (in meinem Arrangement-Abschnitt) und 'VerifyAll()' (in meinem Assert Abschnitt) wäre angemessen? –

+5

@EricSmith Rückblickend glaube ich nicht, dass ich es stark genug ausdrücke. Die Aufteilung Ihrer Arbeit in eine AAA-Bündelung hat erheblich mehr Vorteile als eine Überkonzentration auf Gemeinsamkeiten zwischen der Arrange-Phase und der Assert-Phase. In 90% der Fälle kann man aus den Nuancen, wie man die Verify-Aufrufe am Ende ausdrückt, etwas gewinnen. Man sollte sich daher viel Zeit nehmen, um dies zu optimieren, auch wenn es in manchen Fällen nach einer schmerzhaften Duplizierung aussieht. Einer der Punkte, die http://manning.com/osherove sehr gut macht, ist, dass es für jemanden, der hineinspringt, sinnvoll ist, einen Test zu machen, der kritisch ist - also halte dich an die Konvention! –

+2

Ich bin normalerweise nicht einer, der gegen den Verstand der akzeptierten Weisheit geht, aber bin in jedem Fall noch nicht von den Vorteilen von AAA vs 'Verifyable()'/'VerifyAll()' überzeugt. Mein aktueller Komponententest hat eine große Anzahl von 'Setup (...)' -Aufrufen (> 30). Es könnte jeder mit einem äquivalenten Verify() übereinstimmen, um die Konvention zu erfüllen, aber dies verursacht eine große Menge an Codeverdopplung und wird schwieriger zu verwalten und zu lesen sein, wenn die Anzahl der Komponententests wächst. Ich denke, was ich wirklich frage ist, können Ausnahmen gemacht werden, wenn es eine große Anzahl von Setups gibt oder ist die Vermeidung von "Verifizierbar()" eine harte und schnelle Regel? –

39

Wenn die Methode Verify() am Ende des Tests aufgerufen wird und eine der als verifizierbar markierten Erwartungen nicht aufgerufen wurde, lautet die Ausnahme thrown.

VerifyAll() überprüft nicht nach nachweisbaren Erwartungen.