Wie kann ich die stub node.js built-in fs während der Prüfung?
Ich will stub node.js built-ins wie fs
so, dass ich eigentlich gar nicht machen, alle system-level-Datei-Aufrufe. Das einzige was ich mir vorstellen kann zu tun, ist zu gehen in fs
und alle anderen Einbauten als argument, um alle meine Funktionen zu vermeiden, die echte fs verwendet werden. Dies scheint ein wenig albern und erstellt eine ausführliche Funktion Unterschrift überfüllt mit eingebautem ins als Argumente.
var fs = require('fs');
function findFile(path, callback) {
_findFile(fs, path, callback);
}
function _findFile(fs, path, callback) {
fs.readdir(path, function(err, files) {
//Do something.
});
}
Und dann während der Prüfung:
var stubFs = {
readdir: function(path, callback) {
callback(null, []);
}
};
_findFile.(stubFs, testThing, testCallback);
Gibt es einen besseren Weg, als dieses Recht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich mag mit rewire for stubbing out-verlangen (...) - Anweisungen
- Modul Unter test
module-a.js
Test-Code
module-a-test.js
require
Funktion für Spott out Moduleconst
Rewire und andere stubbing-Lösungen sind gut, wenn das Modul unter test ist das eine, die Aufrufe zu
fs
selbst. Allerdings, wenn das Modul unter test verwendet eine Bibliothek, die verwendetfs
unter, rewire und andere stubbing Lösung Behaart ziemlich schnell.Gibt es eine bessere Lösung, jetzt: mock-fs
Beispiel (schamlos übernommen von seiner readme):
mock-fs
jetzt. Vielen Dank für diese Antwort. Dies ist ideal für unit-Tests mein node-Datei Module.Alternative (obwohl ich denke, dass Noah ' s Vorschlag von rewire ist besser):
Schreiben Sie ein wrapper um
require
namensrequireStubbable
oder so. Setzen Sie diese in einem Modul, welches Sie konfigurieren einmal, in test-setup-code. Da Knoten caches Ergebnis benötigen, Wann immer Sie benötigen, die requireStubbable Modul wieder, würden Sie erhalten die gleiche Funktion konfiguriert. Könntest du Sie so konfigurieren, dass eine beliebige Anzahl von Modulen wäre durch Stubs ersetzt werden, alles andere wäre bestanden unverändert weiter.Jedes Modul, das Sie wollen, um zu unterstützen die Weitergabe in stubs müssen die
requireStubbable
Funktion statt der regulärenrequire
obwohl. Die rewire-Modul nicht haben, der Nachteil, und stattdessen gibt die Kontrolle an den aufrufenden code.Hinzugefügt 26. April
Ich habe noch nie gemerkt, aber da das Objekt (genauer: Objekt-Referenz) zurückgegeben
require("fs")
zwischengespeichert ist, können Sie einfach tun:Wenn Sie diesen code überall
fs.readFile
zeigen, um die oben genannten Funktion überall.Dies funktioniert für die Lunte aus jedem Modul ist eine Reine Ansammlung von Funktionen (wie die meisten built-in-Module). Die Fälle, bei denen es nicht funktioniert, wenn das Modul gibt eine einzige Funktion. Für diese, etwas wie
rewire
notwendig wäre.Stubs Funktionen/Programme, die simulieren das Verhalten von Komponenten/Modulen. Stubs liefern Konserven Antworten auf die Funktion Anrufe, die während der test-cases.
Kann ein Beispiel sein, schreiben einer Datei, ohne das wirklich so.
rewire
für die Reflexion, ist universal im Test. Und es würde viele Bibliotheken, die in der Lage bietet die Möglichkeit, um auszudrücken, etwas.Hier ist, wie ich denke, dieses:
Die Art und Weise Sie es tun, ist die offensichtliche erste Schritt, aber es saugt zu müssen, passieren diese Dinge überall— Anrufer Ihre Funktionen sollten sich nicht darauf, dass Sie möchten, um zu testen mit mocks. Sie wollen nicht einfach nur überschreiben oder monkey-patch die Globale Module in den globalen namespace für deinen test. Und die normale dependency injection-Modell ist ziemlich ausführlich in Javascript, da es keine class-lokal.
Also um das ganze Modul, ich habe getan, wie
(function(fs, net, http) { … })(fs, net, http);
Dann in dem Modul, wenn es eine Klasse mit Konstruktor, machen die verhöhnt optional zusätzliche Parameter an den Konstruktor (oder die möglichen Eigenschaften eines einzelnen
mocks
Objekt-parameter oder sowas) und Ihr test geht in die verhöhnt. Ihr Konstruktor überschreibt den tatsächlichen node-Module innerhalb des Moduls im lokalen Bereich.Abwechselnd, wenn das Modul nur statische Funktionen; haben eine solche Funktion initialisiert die verhöhnt, Sie können überprüfen, dass die Funktion nicht aufgerufen wird, in Ihrer prod code.
Werfen Sie einen Blick auf mit-stubs, besonders an der require() Teil.
Lassen Sie Modul-code als würdest du tun, normalerweise, zB:
Dann auf die tests-Modul (oder jeder unit-Test-framework), verwenden Sie mit-stubs zu ändern (und sogar match oder Validierung) des Verhaltens von fs:
Nun läuft Ihr test-überschreiben des internen Verhaltens von fs in myApp.js, ohne code in den Komponenten.
Kannst du auch noch andere Coole Sachen wie Validierung, wie oft Methoden genannt werden, entsprechen genau den Aufruf der Methode Parameter oder Bereich, auch überschreiben Verhalten auf neue Instanzen der Klasse verwendet intern in myApp.js.
Verwenden
memfs
in-memory-Dateisystem.Check-out mock-fs und fake-fs, die eine Menge tun dies bereits.
Hier eine version, die funktioniert mit dem fs.verspricht api:
Scheint zu sein, eine große Verbesserung. Welche Lösung auch immer Sie finden, wird wahrscheinlich beinhalten das schreiben Ihrer eigenen stub-Funktionen. Die ideale Lösung wäre die untere Ebene, so dass Sie nicht haben, auf alle Dateien, die Sie wollen, dies zu tun, z.B. vielleicht möchten Sie 3rd-party-Bibliotheken, Stub, wie gut.