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 2
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:
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.