Können Sie asynchrone Tests schreiben, die einen Wurf erwarten?

77

Ich schreibe einen asynchronen Test, der erwartet, dass die asynchrone Funktion wie folgt ausgelöst wird:

it("expects to have failed", async () => {
  let getBadResults = async () => {
    await failingAsyncTest()
  }
  expect(await getBadResults()).toThrow()
})

Aber der Scherz scheitert einfach, anstatt den Test zu bestehen:

 FAIL  src/failing-test.spec.js
  ● expects to have failed

    Failed: I should fail!

Wenn ich den Test so umschreibe, sieht er folgendermaßen aus:

expect(async () => {
  await failingAsyncTest()
}).toThrow()

Ich erhalte diesen Fehler anstelle eines bestandenen Tests:

expect(function).toThrow(undefined)

Expected the function to throw an error.
But it didn't throw anything.
Sean
quelle
Hast du es gelöst?
Luislhl
1
Nein, ich habe das Schreiben dieses Tests einfach übersprungen.
Sean
Immer noch kein Glück? Ich habe das gleiche Problem
Roco CTZ

Antworten:

141

Sie können Ihre asynchrone Funktion folgendermaßen testen:

it('should test async errors', async () =>  {        
    await expect(failingAsyncTest())
    .rejects
    .toThrow('I should fail');
});

Die Zeichenfolge "Ich sollte versagen" stimmt mit jedem Teil des ausgelösten Fehlers überein.

Lisandro
quelle
2
Hat tatsächlich Probleme, dokumentiertes Beispiel schlägt fehl. github.com/facebook/jest/issues/3601 hat await expect(failingAsyncTest()).rejects.toHaveProperty('message', 'I should fail');
Problemumgehungen
@Lisandro Dieser Code funktioniert nicht. Ja, der Komponententest ist bestanden, aber nicht, weil failingAsyncTestdie richtige Art von Fehler aufgetreten ist. Es ist offensichtlicher, wenn Sie die Implementierung von ändern failingAsyncTest, um den falschen Fehler anstelle des richtigen auszulösen. (mit Jest 23.6)
Tom
2
@ Tom Die Lösung behauptet , nie den Fehler entsprechen Art . Darin heißt es eindeutig die Zeichenfolge Streichhölzer de Fehlermeldung . Es funktioniert einwandfrei. Beste.
Lisandro
Es ist offensichtlicher, dass toThrow Tests für einen Teilstring durchführt, wenn Sie seinen Parameter in einen RegExp ändern:await expect(failingAsyncTest()).rejects.toThrow(/fail/);
Dan Dascalescu
12

Ich möchte dies nur ergänzen und sagen, dass die Funktion, die Sie testen, ein tatsächliches Fehlerobjekt auslösen muss throw new Error(...). Jest scheint nicht zu erkennen, ob Sie nur einen Ausdruck wie werfen throw 'An error occurred!'.

Steve
quelle