Wie prüfe ich, ob eine Funktion eine bestimmte Methode / Funktion aufruft?

8

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.

Beispiel:

foo.js

%Vor%

bar.js

%Vor%

fooSpec.js

%Vor%

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.

    
Hal Carleton 02.11.2014, 21:33
quelle

2 Antworten

3

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:

foo.js

%Vor%

fooSpec.js

%Vor%     
Hal Carleton 03.11.2014 21:52
quelle
1

Ich verwende expect assertion library mit Mocha , aber Chai könnte analoge Methoden haben

Zuerst

Sie können testen, ob eine Funktion eine bestimmte Methode / Funktion mit Spies aufruft. Du hast das oben in deinem Code getan.

Sekunde

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ür xyz (function) gehe zur zweiten Methode. Die Erklärung ist für beide gleich.

1. Exportieren Sie bar in ein Objekt

bar.js

%Vor%

foo.js

%Vor%

Auf diese Weise können Sie es ausspionieren:

fooSpec.js

%Vor%

2. Setze 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.

foo.js

%Vor%

fooSpec.js

%Vor%

Erklärung

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: Ссылка

    
jpenna 22.01.2017 01:56
quelle

Tags und Links