Wie man einen Test mit expect.js async done () übergibt einen Fehler?

7

Mokka Website sagt:

"Um die Sache noch einfacher zu machen, akzeptiert der done () - Callback einen Fehler, daher können wir ihn direkt verwenden: [siehe ihr Beispiel]"

Also versuchen wir das:

%Vor%

führe es aus und:

%Vor%

Wie machen wir den Test bestanden, wenn die Fehlerreaktion das gewünschte Ergebnis ist?

    
rm.rf.etc 12.10.2013, 20:45
quelle

2 Antworten

19

Das ist nicht asynchron. Die Callback-Funktion dient nur dazu, Mocha darüber zu informieren, dass Sie Async-Code testen, und daher sollte mocha den nächsten Test erst ausführen, wenn Sie die Callback-Funktion aufrufen. Dies ist ein Beispiel für die Verwendung der Callback-Funktion:

%Vor%

Außerdem verarbeitet mocha keine Form von Ausnahmen, asynchron oder anderweitig. Es überlässt das bis zu einer Ausnahmebibliothek Ihrer Wahl. In Ihrem Fall verwenden Sie expect.js ? Wenn dies der Fall ist, behandelt expected erwartete Fehler über die Methode throwException (auch throwError genannt):

%Vor%

Im Allgemeinen wirft asynchronen Code in node.js jetzt keine Fehler. Sie übergeben stattdessen Fehler an den Rückruf als Parameter. Um asynchrone Fehler zu behandeln, können Sie einfach das err-Objekt überprüfen:

%Vor%

Verwenden Sie also to.throwError() , wenn Sie synchrone Fehler überprüfen, und to.be.an(Error) , wenn Sie asynchrone Fehler prüfen.

Zusätzliche Hinweise:

Als ich das das erste Mal sah, war ich ratlos. Wie kann Mocha wissen, dass der Test synchron oder asynchron ist, wenn der einzige Unterschied ist, ob die Funktion, an die Sie übergeben werden, ein Argument akzeptiert oder nicht? Falls Sie wie ich sind und sich den Kopf darüber wundern, wie ich gelernt habe, dass alle Funktionen in Javascript eine length -Eigenschaft haben, die beschreibt, wie viele Argumente sie in ihrer Deklaration akzeptiert. Nein, nicht das arguments.length -Ding, das eigene length der Funktion. Zum Beispiel:

%Vor%

Also überprüft mocha im Grunde die Länge der Funktion, um das Wetter als synchrone Funktion oder asynchrone Funktion zu betrachten, und pausiert die Ausführung, wenn sie asynchron auf den done() -Rückruf wartet.

Noch mehr zusätzliche Hinweise:

Mocha arbeitet wie die meisten anderen js Unit Test Runner und Libraries, indem es Fehler abfängt. Daher erwartet es Funktionen wie expect(foo).to.be.an.integer() , dass ein Fehler ausgegeben wird, wenn die Assertion fehlschlägt. So kommuniziert mocha mit Assertion-Bibliotheken wie expect oder chai.

Wie bereits erwähnt, ist ein gängiges Idiom im Knoten, dass Async-Funktionen keine Fehler ausgeben, sondern ein Fehlerobjekt als erstes Argument übergeben. Wenn dies geschieht, kann mocha den Fehler nicht erkennen und kann daher einen fehlerhaften Test nicht erkennen. Das Problem besteht darin, dass wenn Sie das Fehlerobjekt vom asynchronen Code an die Callback-Funktion übergeben, wird es genauso behandelt wie ein geworfener Fehler.

Also, nimm eines meiner obigen Beispiele:

%Vor%

Oder einfach:

%Vor%

Genau genommen ist diese Funktion ein wenig überflüssig, wenn sie mit Bibliotheken wie expect.js verwendet wird, mit denen Sie das zurückgegebene Fehlerobjekt manuell überprüfen können. Es ist jedoch nützlich, wenn Ihre Assertion-Bibliothek das Fehlerobjekt nicht überprüfen kann Das Ergebnis der asynchronen Funktion interessiert mich nicht, aber ich möchte nur wissen, dass keine Fehler ausgelöst werden.

    
slebetman 13.10.2013, 00:33
quelle
0

Sie können Ihren Async-Befehl auch wie folgt zurückgeben:

%Vor%     
LuxLee 17.01.2017 07:05
quelle

Tags und Links