Ich arbeite mit einem Code, bei dem ich den von der Funktion ausgelösten Ausnahmetyp testen muss (Ist es TypeError, ReferenceError usw.)?
Mein aktuelles Testframework ist AVA und ich kann es als zweite Argumentmethode testen t.throws
, wie hier:
it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', (t) => {
const error = t.throws(() => {
throwError();
}, TypeError);
t.is(error.message, 'UNKNOWN ERROR');
});
Ich fing an, meine Tests in Jest umzuschreiben und konnte nicht herausfinden, wie ich das einfach machen konnte. Ist es überhaupt möglich?
quelle
expect('here').not.toBe('here');
zum Spaß schreiben :-)expect('to be').not.toBe('to be')
im Shakespeare-Stil.Ich benutze eine etwas prägnantere Version:
quelle
Aufgrund meiner (wenn auch begrenzten) Exposition gegenüber Jest habe ich festgestellt, dass dies
expect().toThrow()
geeignet ist, wenn Sie NUR einen Fehler eines bestimmten Typs testen möchten:expect(() => functionUnderTest()).toThrow(TypeError);
ODER es wird ein Fehler mit einer bestimmten Meldung ausgegeben:
expect(() => functionUnderTest()).toThrow('Something bad happened!');
Wenn Sie versuchen, beides zu tun, erhalten Sie ein falsches Positiv. Wenn Ihr Code beispielsweise ausgelöst wird
RangeError('Something bad happened!')
, besteht dieser Test Folgendes:expect(() => functionUnderTest()).toThrow(new TypeError('Something bad happened!'));
Die Antwort von bodolsog, die die Verwendung eines try / catch vorschlägt, ist nah, aber anstatt zu erwarten, dass true falsch ist, um sicherzustellen, dass die erwarteten Zusicherungen im catch getroffen werden, können Sie stattdessen
expect.assertions(2)
zu Beginn Ihres Tests2
die Anzahl der erwarteten Zusicherungen verwenden . Ich bin der Meinung, dass dies die Absicht des Tests genauer beschreibt.Vollständiges Beispiel zum Testen des Typs UND der Meldung eines Fehlers:
Wenn
functionUnderTest()
KEIN Fehler ausgegeben wird, werden die Zusicherungen getroffen, aber die schlagenexpect.assertions(2)
fehl und der Test schlägt fehl.quelle
expect.hasAssertions()
Möglicherweise eine bessere Alternative, wenn der Test keine Zusicherungen außerhalb hatcatch
, da Sie die Nummer nicht aktualisieren müssen, wenn Sie Zusicherungen hinzufügen / entfernen.Ich habe es nicht selbst versucht, aber ich würde vorschlagen, Jests toThrow- Behauptung zu verwenden. Ich denke, Ihr Beispiel würde ungefähr so aussehen:
Auch hier habe ich es nicht getestet, aber ich denke, es sollte funktionieren.
quelle
Jest hat eine Methode
toThrow(error)
, um zu testen, ob eine Funktion beim Aufruf ausgelöst wird.In Ihrem Fall sollten Sie es also so nennen:
Die Dokumente
quelle
jest.spyOn(service, 'create').mockImplementation(() => { throw new Error(); });
Wenn die verspottete Methodecreate
nicht istasync
.Mit dem modernen Scherz können Sie den abgelehnten Wert genauer überprüfen. Beispielsweise:
wird mit Fehler fehlschlagen
quelle
In der Dokumentation ist klar, wie das geht. Nehmen wir an, ich habe eine Funktion, die zwei Parameter akzeptiert und einen Fehler auslöst, wenn einer davon ist
null
.Dein Test
quelle
Wenn Sie mit
Promise
s arbeiten:quelle
Am Ende habe ich eine Convenience-Methode für unsere Test-Utils-Bibliothek geschrieben
quelle
Neben Peter Danis 'Beitrag wollte er nur den Teil seiner Lösung hervorheben, der darin besteht, "eine Funktion in" Expect (Funktion) .toThrow (Leerzeichen oder Fehlertyp) zu übergeben ".
Wenn Sie in Jest auf einen Fall testen, in dem ein Fehler ausgelöst werden soll, müssen Sie innerhalb Ihrer erwarteten () Umhüllung der zu testenden Funktion eine zusätzliche Umbruchschicht für Pfeilfunktionen bereitstellen, damit sie funktioniert. Dh
Falsch (aber der logische Ansatz der meisten Leute):
Richtig:
Es ist sehr seltsam, sollte aber den Test erfolgreich ausführen.
quelle
Versuchen
expect(t).rejects.toThrow()
quelle
try
? Es gibt keinen Versuch - sondern eine Antwort. Wenn dies eine Antwort ist, gehen Sie bitte näher darauf ein. Was fügen Sie der vorhandenen Antwort hinzu?