D'après mon exposition (bien que limitée) à Jest, j'ai trouvé que cela expect().toThrow()
convient si vous voulez UNIQUEMENT tester une erreur d'un type spécifique:
expect(() => functionUnderTest()).toThrow(TypeError);
OU une erreur est générée avec un message spécifique:
expect(() => functionUnderTest()).toThrow('Something bad happened!');
Si vous essayez de faire les deux, vous obtiendrez un faux positif. Par exemple, si votre code lance RangeError('Something bad happened!')
, ce test passera:
expect(() => functionUnderTest()).toThrow(new TypeError('Something bad happened!'));
La réponse de bodolsog qui suggère d'utiliser un try / catch est proche, mais plutôt que de s'attendre à ce que true soit faux pour s'assurer que les assertions attendues dans la capture sont atteintes, vous pouvez à la place utiliser expect.assertions(2)
au début de votre test où 2
est le nombre d'assertions attendues . Je pense que cela décrit plus précisément l'intention du test.
Exemple complet de test du type AND message d'une erreur:
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!');
}
});
});
Si functionUnderTest()
ne lance PAS d'erreur, les assertions seront frappées mais le expect.assertions(2)
échouera et le test échouera.