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 Tests 2die 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:
describe('functionUnderTest', () => {
it('should throw a specific type of error.', () => {
expect.assertions(2);
try {
functionUnderTest();
} catch (error) {
expect(error).toBeInstanceOf(TypeError);
expect(error).toHaveProperty('message', 'Something bad happened!');
}
});
});
Wenn functionUnderTest()KEIN Fehler ausgegeben wird, werden die Zusicherungen getroffen, aber die schlagen expect.assertions(2)fehl und der Test schlägt fehl.