Ich versuche herauszufinden, wie man interne (dh nicht exportierte) Funktionen in NodeJs testet (vorzugsweise mit Mokka oder Jasmin). Und ich habe keine Ahnung!
Angenommen, ich habe ein solches Modul:
function exported(i) {
return notExported(i) + 1;
}
function notExported(i) {
return i*2;
}
exports.exported = exported;
Und der folgende Test (Mokka):
var assert = require('assert'),
test = require('../modules/core/test');
describe('test', function(){
describe('#exported(i)', function(){
it('should return (i*2)+1 for any given i', function(){
assert.equal(3, test.exported(1));
assert.equal(5, test.exported(2));
});
});
});
Gibt es eine Möglichkeit, die notExported
Funktion zu testen , ohne sie tatsächlich zu exportieren, da sie nicht für die Belichtung vorgesehen ist?
node.js
unit-testing
jasmine
mocha
xavier.seignard
quelle
quelle
Antworten:
Das Rewire- Modul ist definitiv die Antwort.
Hier ist mein Code für den Zugriff auf eine nicht exportierte Funktion und das Testen mit Mocha.
application.js:
test.js:
quelle
Cannot find module '../../package' from 'node.js'
. Hast du das gesehen?Der Trick besteht darin, die
NODE_ENV
Umgebungsvariable auf so etwas wie zu setzentest
und sie dann bedingt zu exportieren.Angenommen, Sie haben Mokka nicht global installiert, könnte sich im Stammverzeichnis Ihres App-Verzeichnisses ein Makefile befinden, das Folgendes enthält:
Diese make-Datei richtet NODE_ENV ein, bevor Mokka ausgeführt wird. Sie können dann Ihre Mokka-Tests mit
make test
über die Befehlszeile ausführen .Jetzt können Sie Ihre Funktion bedingt exportieren, die normalerweise nicht nur exportiert wird, wenn Ihre Mokka-Tests ausgeführt werden:
Die andere Antwort schlug vor, ein VM-Modul zum Auswerten der Datei zu verwenden, dies funktioniert jedoch nicht und es wird ein Fehler ausgegeben, der besagt, dass Exporte nicht definiert sind.
quelle
BEARBEITEN:
Das Laden eines Moduls mit
vm
kann zu unerwartetem Verhalten führen (z. B. arbeitet derinstanceof
Bediener nicht mehr mit Objekten, die in einem solchen Modul erstellt wurden, da sich die globalen Prototypen von denen unterscheiden, die in Modulen verwendet werden, die normalerweise mit geladen werdenrequire
). Ich verwende die folgende Technik nicht mehr und verwende stattdessen das Umverdrahtungsmodul . Es funktioniert wunderbar. Hier ist meine ursprüngliche Antwort:Ausarbeitung der Antwort von srosh ...
Es fühlt sich ein bisschen hackig an, aber ich habe ein einfaches "test_utils.js" -Modul geschrieben, mit dem Sie tun können, was Sie wollen, ohne bedingte Exporte in Ihren Anwendungsmodulen zu haben:
Es gibt einige weitere Dinge, die im globalen
module
Objekt eines Knotenmoduls enthalten sind und möglicherweise auch in dascontext
obige Objekt aufgenommen werden müssen, aber dies ist die Mindestmenge, die ich benötige, damit es funktioniert.Hier ist ein Beispiel mit Mokka BDD:
quelle
rewire
?In Zusammenarbeit mit Jasmine habe ich versucht, die von Anthony Mayfield vorgeschlagene Lösung basierend auf der Neuverdrahtung zu vertiefen .
Ich habe die folgende Funktion implementiert ( Achtung : noch nicht gründlich getestet, nur als mögliche Strategie geteilt) :
Mit einer solchen Funktion können Sie sowohl Methoden nicht exportierter Objekte als auch nicht exportierter Funktionen der obersten Ebene wie folgt ausspionieren:
Dann können Sie folgende Erwartungen setzen:
quelle
Ich habe einen recht einfachen Weg gefunden, mit dem Sie diese internen Funktionen innerhalb der Tests testen, ausspionieren und verspotten können:
Angenommen, wir haben ein Knotenmodul wie das folgende:
Wenn wir jetzt testen und ausspionieren und verspotten möchten,
myInternalFn
ohne es in der Produktion zu exportieren, müssen wir die Datei wie folgt verbessern:Jetzt können Sie
myInternalFn
überall dort testen, ausspionieren und verspotten , wo Sie es verwenden,testable.myInternalFn
und in der Produktion wird es nicht exportiert .quelle
Sie können mit dem VM- Modul einen neuen Kontext erstellen und die darin enthaltene JS-Datei auswerten, ähnlich wie bei Repl. dann haben Sie Zugriff auf alles, was es deklariert.
quelle
Dies wird nicht empfohlen, aber wenn Sie nicht
rewire
wie von @Antoine vorgeschlagen verwenden können, können Sie die Datei immer nur lesen und verwendeneval()
.Ich fand dies nützlich, als ich clientseitige JS-Dateien für ein Legacy-System testete.
Die JS-Dateien würden viele globale Variablen
window
ohnerequire(...)
undmodule.exports
Anweisungen einrichten (es war ohnehin kein Modulbündler wie Webpack oder Browserify verfügbar, um diese Anweisungen zu entfernen).Anstatt die gesamte Codebasis umzugestalten, konnten wir Unit-Tests in unsere clientseitige JS integrieren.
quelle