Ich versuche, einen Test für das Jasmine Test Framework zu schreiben, der einen Fehler erwartet. Im Moment verwende ich eine Jasmine Node.js-Integration von GitHub .
In meinem Knotenmodul habe ich folgenden Code:
throw new Error("Parsing is not possible");
Jetzt versuche ich einen Test zu schreiben, der diesen Fehler erwartet:
describe('my suite...', function() {
[..]
it('should not parse foo', function() {
[..]
expect(parser.parse(raw)).toThrow(new Error("Parsing is not possible"));
});
});
Ich habe auch Error()
und einige andere Varianten ausprobiert und kann einfach nicht herausfinden, wie es funktioniert.
javascript
testing
node.js
jasmine
Echox
quelle
quelle
Function.bind
: stackoverflow.com/a/13233194/294855Antworten:
Sie sollten eine Funktion an den
expect(...)
Aufruf übergeben. Der Code, den Sie hier haben:versucht tatsächlich ,
parser.parse(raw)
einen Versuch aufzurufen , das Ergebnis an weiterzugebenexpect(...)
,Versuchen Sie stattdessen eine anonyme Funktion:
quelle
expect(parser.parse).toThrow(...)
expect(blah).toThrow()
. Keine Argumente bedeuten überprüfen, ob es überhaupt wirft. Kein String-Matching erforderlich. Siehe auch: stackoverflow.com/a/9525172/1804678parser.parse
verwendet wirdthis
, führt das Übergeben ohne Kontext zu unerwarteten Ergebnissen. Sie könnten bestehenparser.parse.bind(parser)
, aber ehrlich gesagt ... eine anonyme Funktion wäre eleganter.Du benutzt:
Aber wenn Sie sich den Funktionskommentar ansehen (erwartet wird ein String):
Ich nehme an, Sie sollten es wahrscheinlich so schreiben (mit Lambda - anonyme Funktion):
Dies wird im folgenden Beispiel bestätigt:
Douglas Crockford empfiehlt diesen Ansatz nachdrücklich, anstatt "throw new Error ()" (Prototyping-Methode) zu verwenden:
quelle
Error
( jsfiddle.net/k1mxey8j ) auslösen . Ihr geworfenes Objekt verfügt jedoch natürlich nicht über die.stack
Eigenschaft. Dies kann wichtig sein, wenn Sie eine automatische Fehlerberichterstattung einrichten möchten .Eine elegantere Lösung als das Erstellen einer anonymen Funktion, deren einziger Zweck darin besteht, eine andere zu verpacken, ist die Verwendung der
bind
Funktion von es5 . Die Bindungsfunktion erstellt eine neue Funktion, derenthis
Schlüsselwort beim Aufruf auf den angegebenen Wert gesetzt wird, wobei eine bestimmte Folge von Argumenten vor jeder angegebenen steht, die beim Aufruf der neuen Funktion angegeben wird.Anstatt:
expect(function () { parser.parse(raw, config); } ).toThrow("Parsing is not possible");
Erwägen:
expect(parser.parse.bind(parser, raw, config)).toThrow("Parsing is not possible");
Die Bindungssyntax ermöglicht es Ihnen, Funktionen mit unterschiedlichen
this
Werten zu testen und macht den Test meiner Meinung nach besser lesbar. Siehe auch: https://stackoverflow.com/a/13233194/1248889quelle
Ich ersetze Jasmines toThrow-Matcher durch den folgenden, mit dem Sie die Namenseigenschaft oder die Nachrichteneigenschaft der Ausnahme abgleichen können. Für mich macht dies das Schreiben von Tests einfacher und weniger spröde, da ich Folgendes tun kann:
und dann mit folgendem testen:
Auf diese Weise kann ich die Ausnahmemeldung später optimieren, ohne die Tests zu unterbrechen, wenn es darauf ankommt, dass der erwartete Ausnahmetyp ausgelöst wird.
Dies ist der Ersatz für toThrow, der dies ermöglicht:
quelle
expect(blah).toThrow()
. Keine Argumente bedeuten überprüfen, ob es überhaupt wirft. Kein String-Matching erforderlich. Siehe auch: stackoverflow.com/a/9525172/1804678Wie bereits erwähnt, muss eine Funktion übergeben werden,
toThrow
da es sich um die Funktion handelt, die Sie in Ihrem Test beschreiben: "Ich erwarte, dass diese Funktion x auslöst."Wenn Sie Jasmine-Matcher verwenden , können Sie auch eine der folgenden Optionen verwenden, wenn sie der Situation entsprechen.
oder
quelle
expect(foo).toThrowError(TypeError);
in Jasmine 2.5: jasmine.github.io/2.5/introductionIch weiß, dass das mehr Code ist, aber Sie können auch Folgendes tun:
quelle
Für Coffeescript-Liebhaber
quelle
Für alle, die immer noch mit diesem Problem konfrontiert sind, hat die veröffentlichte Lösung nicht funktioniert und diesen Fehler immer wieder ausgelöst:
Error: Expected function to throw an exception.
Später wurde mir klar, dass die Funktion, von der ich erwartet hatte, dass sie einen Fehler auslöst, eine asynchrone Funktion ist und ein Versprechen erwartet abgelehnt werden und dann Fehler werfen und das habe ich in meinem Code getan:und das habe ich in meinem Test gemacht und es hat funktioniert:
quelle
expectAsync
jasmine.github.io/api/3.3/async-matchers.html