Gibt es in Mocha eine Möglichkeit, zu testen, ob eine Funktion eine bestimmte Methode oder externe Funktion aufruft?
Ich verwende Mocha mit Chai, bin aber offen für alle anderen Assertion-Bibliotheken.
Ok, so zu testen, ob ein Methid aufgerufen wird, ist ziemlich einfach mit Sinon. Ich bin mir nicht sicher, zu testen, ob eine externe Funktion aufgerufen wird. Also habe ich die Beispiele aktualisiert, um etwas mehr "reale Welt" darzustellen. Ich arbeite an einer Knoten-App, also sind foo.js
und bar.js
beide Module.
Wie Sie sehen können, habe ich herausgefunden, wie man Foo.prototype.bar
testen kann, aber ich finde keinen Weg, den zweiten und dritten Test zu implementieren.
Also diese Frage war wirklich zwei in eins.
Erstens "Testen, ob eine Methode aufgerufen wird": Ich habe den Code dafür im Beispiel dargelegt, aber im Grunde, indem Sie sinon.js verwenden, wickeln Sie die Methode einfach in einen "Spion", der es Ihnen ermöglicht, einen Test zu schreiben, der erwartet, dass dieser Spion aufgerufen wurde.
Zweitens , "wie getestet wird, ob eine private Funktion (eine, die nicht als Teil des Moduls exportiert wurde)" aufgerufen wurde:
Grundsätzlich nicht. Es ist möglich, diese Funktionen in einer Testumgebung und nicht in der Produktion zu exportieren, aber das erscheint mir etwas zu hackig.
Ich bin zu dem Schluss gekommen, dass man beim Aufruf eines anderen Moduls den TDD-Zyklus unterbrechen und nicht testen sollte, da es wahrscheinlich eine kleine Menge Code ist und das Modul bereits selbst getestet wurde.
Wenn Sie eine private Funktion aufrufen, die in Ihrem Modul deklariert ist und sie testen möchten, sollten Sie einen breiteren Test schreiben, der das Ergebnis dieser Funktion testet, anstatt zu testen, ob die Funktion aufgerufen wird oder Was passiert eigentlich in der Funktion?
Hier ist ein wirklich einfaches Beispiel:
Ich verwende expect
assertion library mit Mocha
, aber Chai
könnte analoge Methoden haben
Sie können testen, ob eine Funktion eine bestimmte Methode / Funktion mit Spies aufruft. Du hast das oben in deinem Code getan.
Das Problem mit dem Code, den Sie testen, ist Context. Also werde ich in dieser Antwort darauf eingehen. Sie können testen, ob eine externe Funktion aufgerufen wird, aber benötigt einen Kontext , daher müssen Sie möglicherweise Ihren Code ändern.
Ich verwende
bar
(Modul) als Beispiel. Fürxyz
(function) gehe zur zweiten Methode. Die Erklärung ist für beide gleich.
bar
in ein Objekt Auf diese Weise können Sie es ausspionieren:
bar
module als Foo's Prototyp-Methode Wenn Sie bar.js
nicht ändern möchten, können Sie das erforderliche Modul als Prototypmethode von Foo festlegen. Dann haben Sie einen Kontext zum Ausspionieren.
Die Änderungen, die Sie vornehmen müssen, dienen dazu, den Kontext Ihrer Variablen zu ändern.
Um es klar zu machen:
%Vor% In diesem Snippet benötigen Sie bar
und setzen später this.bar
mit Foo.prototype
. Also, wie können Sie 2 Variablen mit dem gleichen Namen setzen und sich gegenseitig gut referenzieren?
Die Antwort lautet Kontext und Umfang. Ihr this.bar
verweist auf die% bar
Variable, die in this
context gesetzt wurde (was auf Foo
zeigt). Auf der anderen Seite, Ihre bar
- Note gibt es keine this
- bezieht sich auf die Variable bar
im Funktionsumfang (Modul) festgelegt.
Sie können also Ihre Foo.prototype.bar
testen, da es sich um eine Modulmethode handelt, einen Kontext hat und Sie es ausspionieren können. Buy Sie können die erforderliche bar
nicht ausspionieren, da es sich um einen Bereich handelt (denken Sie daran, dass es privat ist).
Gut zu lesen: Ссылка
Tags und Links javascript node.js tdd mocha chai