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.
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? –
@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! –
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? –