Ich habe verschiedene Artikel über Mocking vs Stubbing in Tests gelesen, einschließlich Martin Fowlers Spötteleien sind keine Spötteleien aber ich verstehe den Unterschied immer noch nicht.
Antworten
Zu viele Anzeigen?Um es ganz klar und praktisch auszudrücken:
Stummel: Eine Klasse oder ein Objekt, das die Methoden der zu fälschenden Klasse/des zu fälschenden Objekts implementiert und immer das zurückgibt, was Sie wollen.
Beispiel in JavaScript:
var Stub = {
method_a: function(param_a, param_b){
return 'This is an static result';
}
}
Spott: Dasselbe wie stub, aber es fügt eine Logik hinzu, die "verifiziert", wenn eine Methode aufgerufen wird, so dass Sie sicher sein können, dass eine Implementierung diese Methode aufruft.
Wie @mLevan sagt, stellen Sie sich als Beispiel vor, dass Sie eine Klasse zur Benutzerregistrierung testen. Nach dem Aufruf von Save sollte sie SendConfirmationEmail aufrufen.
Ein sehr dummer Code Beispiel:
var Mock = {
calls: {
method_a: 0
}
method_a: function(param_a, param_b){
this.method_a++;
console.log('Mock.method_a its been called!');
}
}
Mit einer mentales Modell hat mir wirklich geholfen, dies zu verstehen, im Gegensatz zu all den Erklärungen und Artikeln, die nicht so recht "reingehen".
Stellen Sie sich vor, Ihr Kind hat eine Glasplatte auf dem Tisch und beginnt damit zu spielen. Nun haben Sie Angst, dass sie kaputt geht. Also geben Sie ihm stattdessen einen Plastikteller. Das wäre ein Mock (gleiches Verhalten, gleiche Schnittstelle, "weichere" Implementierung).
Angenommen, Sie haben keinen Ersatz aus Plastik und erklären: "Wenn du weiter damit spielst, geht es kaputt! Das ist ein Stummel haben Sie einen vordefinierten Zustand im Voraus festgelegt.
A Schnuller wäre die Gabel, die er gar nicht benutzt hat... und eine Spionage könnte so etwas wie die gleiche Erklärung sein, die Sie bereits verwendet haben und die funktioniert hat.
Siehe Test Doubles:
-
Gefälschte : Fälschungen sind Objekte, die funktionierende Implementierungen haben, die aber nicht mit der Produktionsimplementierung übereinstimmen. Wie zum Beispiel In-Memory-Implementierung von Data Access Object oder Repository.
-
Stummel : Stub ist ein Objekt, das vordefinierte Daten enthält und diese verwendet, um Anrufe während der Tests zu beantworten. Wie zum Beispiel : ein Objekt, das Daten aus der Datenbank abrufen muss, um auf einen Methodenaufruf zu reagieren.
-
Verspottet : Mocks sind Objekte, die Anrufe registrieren, die sie erhalten. In der Test Assertion können wir an Mocks überprüfen, ob alle erwarteten Aktionen durchgeführt wurden. Wie zum Beispiel : eine Funktion, die den E-Mail-Versanddienst aufruft. für mehr einfach überprüfen este .
Mir gefällt die von Roy Osherove gegebene Erklärung [Video-Link] .
Jede Klasse und jedes Objekt, das erstellt wird, ist ein Fake. Es ist ein Mock, wenn Sie die Aufrufe gegen sie. Ansonsten ist es ein Stub.