Was sind strikte und nicht-strikte verspottet?
Habe ich begonnen, mit moq für Spott. Kann jemand mir erklären das Konzept der strikten und nicht-strikten verspottet? Wie können Sie verwendet werden kann moq?
edit:
in dem Szenario verwenden wir, welche Art von mock?
Frage mich, ob die strikte vs. nicht-strikte ist der gleiche wie der Unterschied zwischen "strict unit-tests" und "lose (black-box) - unit-Tests" beschrieben, in der Winkel $httpBackend-Dokumentation
InformationsquelleAutor Sandbox | 2010-06-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht sicher moq speziell, aber hier ist, wie streng mocks Arbeit in Rhino. Ich erkläre, dass ich erwarte einen Anruf zu
foo.Bar
auf mein Objektfoo
:Wenn der aufrufende code hat
dann bin ich gut, weil die Erwartungen genau erfüllt.
Jedoch, wenn der aufrufende code ist:
dann meine Erwartung ist fehlgeschlagen, weil ich Sie nicht explizit erwarten einen Anruf zu
foo.Quux
.Zusammenfassen, dass eine strikte mock scheitern sofort, wenn irgendetwas unterscheidet sich von den Erwartungen. Auf der anderen Seite, eine nicht-strikte mock (oder einem Stummel) wird gerne "ignorieren" wird der Aufruf
foo.Quux
und sollte es wieder eindefault(T)
für den RückgabetypT
vonfoo.Quux
.Den Ersteller des Rhino empfiehlt, dass Sie vermeiden strikt verhöhnt (und lieber stubs), da Sie in der Regel nicht wollen, dass Ihr test, um Fehler beim Empfang einer unerwarteten Anruf wie oben. Es macht refactoring von Ihrem code viel schwieriger, wenn man zu fix Dutzende von test, die verlassen sich auf die genaue original Verhalten.
Geben Sie in strict oder non-strict die
Mock
Konstruktor, eineMockBehavior
argument. Das Standardverhalten (wenn nicht, Angabe derMockBehavior
) zu sein scheint nicht-strikter (Sie nennen es "Locker").Ich denke, es wäre gut zu gehören Mark ' s Kommentar in der Antwort von selbst; sowohl die Erklärung, wie zu schaffen, strikte vs. nicht-strikte, und eine Erwähnung der alias "Locker".
InformationsquelleAutor Mark Rushakoff
Jemals über Gegeben /Wenn /Dann?
Dieses Muster wird in BDD - Szenarien, und ist auch relevant für unit-tests.
Wenn Sie die Einstellung der Kontext, die Sie die Informationen, die den Kontext stellt. Zum Beispiel, wenn Sie schauen, bis etwas von Id, das ist Kontext. Wenn es nicht vorhanden ist, wird der test nicht ausgeführt werden. In diesem Fall, den Sie verwenden möchten eine NiceMock oder ein Stub-oder was auch immer - Moq Standard Weg laufen.
Wenn Sie möchten, um zu überprüfen, ein Ergebnis, das Sie verwenden können, Moq ist zu überprüfen. In diesem Fall möchten Sie Datensatz die relevanten Interaktionen. Glücklicherweise ist dies auch Moq Standard Weg laufen. Es wird sich nicht beschweren, wenn etwas passiert, dass Sie nicht interessiert waren, für diesen test.
StrictMock ist es, wenn Sie wollen, keine unerwartete Wechselwirkungen auftreten. Es ist wie im alten Stil mocking-frameworks ausgeführt. Wenn Sie BDD-style-Beispiele, die Sie wahrscheinlich nicht wollen, dass diese. Es hat eine Tendenz, die tests ein bisschen spröde und schwerer zu Lesen, als wenn Sie trennen die Aspekte von Verhalten, das Sie interessiert. Sie müssen die Erwartungen sowohl der Kontext und das Ergebnis, für alle Ergebnisse, die auftreten, unabhängig davon, ob Sie von Interesse ist oder nicht.
Zum Beispiel, wenn Sie Tests mit einem controller und Spott beide Ihrer Prüfung und Ihrem repository haben, und Sie wollen, stellen Sie sicher, dass Sie gespeichert haben Ihr Objekt mit einem strengen verspotten Sie müssen auch prüfen, ob Sie bestätigt haben das Objekt zuerst. Ich bevorzuge, um zu sehen, diese beiden Aspekte von Verhalten in separaten Beispielen, weil es macht es einfacher für mich zu verstehen, den Wert und Verhalten der controller.
In den letzten vier Jahren habe ich noch nicht gefunden, ein einziges Beispiel, die erforderlich, die Verwendung von einer strengen mock - entweder es war ein Ergebnis wollte ich überprüfen, ob (auch wenn ich überprüfen Sie die Anzahl der Zeiten, es ' s genannt) oder einen Kontext für die ich erzählen kann, wenn ich darauf korrekt zu reagieren, um die Informationen zur Verfügung gestellt. Also um deine Frage zu beantworten:
NB: ich bin stark voreingenommen in Richtung BDD, so hard-core-TDDers kann nicht mit mir übereinstimmen, und es wird richtig sein für die Art, wie, die Sie arbeiten.
Wenn Sie die änderung der Funktionalität Sie schreiben ein Versagen zuerst testen; das ist ein Kernstück der TDD-Zyklus, unabhängig davon, welche Art von mock, die Sie verwenden. Wenn Sie verweisen auf Methoden unbeabsichtigt ändern, dass lesbaren tests mit Aufgaben sorgfältig erwogen verringert die Wahrscheinlichkeit, dass das passiert sowieso.
Ich denke, der beste Weg, dies zu nähern, ist zu haben, alle tests verlieren, außer für eine, streng. So, wenn Sie machen eine Reihe von änderungen, wie, dass 1 test schlägt fehl, und wird Sie daran erinnern, um sicherzustellen, dass Sie haben alle Ihre neuen Fällen bedeckt, aber es ist nicht so ein Schmerz zu beheben, dass ein test dann.
Wenn Sie TDD Recht, ist es kaum Fänge bugs. Es hat jedoch auch helfen, gutes design und self-code kommentieren. Ich finde, dass Menschen, die denken, es als "Test" neigen dazu, die pin-unten Ihren code ein, damit es nicht zu brechen; ich bevorzuge, um es einfach und sicher zu ändern. Aber dann bin ich wirklich ein BDDer, nicht ein TDDer, auch auf dieser Ebene. dannorth.net/introducing-bdd
Ich bin nicht wirklich ein TDDer, aber wenn es verhindert, dass 1 Fehler durch hinzufügen von 1 strengen test, war es schon Wert. 🙂 Wenn Sie haben noch keine strengen tests, die Sie vielleicht verpasst haben ein Gerät testen, ohne es zu merken. Ich hätte lieber die Gewissheit, dass mindestens 1 test zu fangen im Begriff ist, für mich.
InformationsquelleAutor Lunivore
Hier ist eine gute Artikel.
Ich in der Regel am Ende mit etwas wie dieses
...und ich Strenge mocks für die 3 Mitarbeiter zu test-login(username). Ich sehe nicht, wie Streng Spottet, sollte niemals verwendet werden.
InformationsquelleAutor mickthompson
Habe ich eine einfache Konvention:
Strenge verspottet, wenn das system unter test (SUT) delegieren den Aufruf der zugrunde liegenden verspottet Schicht, ohne Sie wirklich zu ändern oder die Anwendung von business-Logik, um die Argumente an sich selbst.
Lockeres spottet, wenn sich das SUT gilt business-Logik der Argumente übergeben, um sich selbst und geht auf einige abgeleitete/modifizierten Werte an die verspottet Schicht.
ZB:
Können sagen, wir haben Datenbank-Anbieter StudentDAL, die hat zwei Methoden:
Data-access-Schnittstelle sieht wie folgt aus:
Die Umsetzung verbraucht das DAL sieht wie folgt aus:
InformationsquelleAutor Amol