Ich benutze Mocha mit Sinon Unit-Test meine node.js Module. Ich habe andere Abhängigkeiten erfolgreich verspottet (andere Module, die ich geschrieben habe), aber ich habe Probleme beim Stoppen nicht reiner Funktionen (wie Math.random()
und Date.now()
). Ich habe Folgendes versucht (vereinfacht, so dass diese Frage nicht so lokalisiert ist), aber Math.random()
wurde wegen eines offensichtlichen Umfangproblems nicht abgestempelt. Die Instanzen von Math
sind unabhängig zwischen der Testdatei und mymodule.js
.
test.js
%Vor% Also würde in diesem erfundenen Beispiel functThatDependsOnRandom()
wie folgt aussehen:
mymodule.js
%Vor% Ist es möglich, Math.random()
in diesem Szenario mit Sinon auszugeben?
Ja, das ist eine alte Frage, aber sie ist gültig. Hier ist eine Antwort, die funktioniert, obwohl ich gerne Vorschläge hören würde, wie ich es verbessern kann.
Die Art und Weise, wie ich das im Browser gehandhabt habe, ist das Erstellen eines Proxy-Objekts. Beispielsweise können Sie das Fensterobjekt im Browser nicht stubben, sodass Sie ein Proxyobjekt namens windowProxy erstellen können. Wenn Sie den Speicherort abrufen möchten, erstellen Sie eine Methode in windowProxy namens location, die windowLocation zurückgibt oder setzt. Dann, wenn Sie testen, spielen Sie windowProxy.location.
Sie können das gleiche mit Node.js machen, aber es funktioniert nicht ganz so einfach. Die einfache Version ist, dass ein Modul den privaten Namespace eines anderen Moduls nicht stören kann.
Die Lösung besteht darin, das Spott -Modul zu verwenden. Wenn Sie nach der Initiierung des Spottes require()
mit einem Parameter aufrufen, der dem entspricht, was Sie Spott zu Spott gesagt haben, können Sie die require-Anweisung überschreiben und Ihre eigenen Eigenschaften zurückgeben.
UPDATE: Ich habe ein voll funktionsfähiges Codebeispiel erstellt. Es ist auf Github bei newz2000 / dice-tdd und über npm verfügbar . / END UPDATE
Die Dokumente sind ziemlich gut, also empfehle ich, sie zu lesen, aber hier ist ein Beispiel:
Erstellen Sie eine Datei randomHelper.js
mit folgendem Inhalt:
Dann in Ihrem Code, der eine zufällige Zahl benötigt, Sie:
%Vor%Alles sollte wie normal funktionieren. Ihr Proxy-Objekt verhält sich genauso wie Math.random.
Es ist wichtig zu beachten, dass die require-Anweisung einen einzelnen Parameter akzeptiert, './randomHelper'
. Das müssen wir beachten.
Jetzt in Ihrem Test, (ich benutze zum Beispiel mocha und chai):
%Vor%Und das ist es. In diesem Fall gibt unser Stub immer 0.0.99999 zurück; Sie können es natürlich ändern.
Sind Sie sicher, dass nicht das Meckern von Math
das Problem ist? Es scheint, dass diese Linie wenig Sinn macht:
Sie mock others
in einem Modul, aber verwenden Sie es in einem anderen. Ich denke nicht, dass Sie die verspottete Version in mymodule.js
bekommen werden. Auf der anderen Seite sollte stubbing Math.random funktionieren, da dies für alle Module global ist.
Sehen Sie sich auch diese SO , um Abhängigkeiten in nodeJS-Tests zu verspotten.
Tags und Links javascript unit-testing node.js dependency-injection sinon