Por mi exposición (aunque limitada) a Jest, he encontrado que expect().toThrow()
es adecuado si solo desea probar que un error se arroja de un tipo específico:
expect(() => functionUnderTest()).toThrow(TypeError);
O se produce un error con un mensaje específico:
expect(() => functionUnderTest()).toThrow('Something bad happened!');
Si intentas hacer ambas cosas, obtendrás un falso positivo. Por ejemplo, si arroja su código RangeError('Something bad happened!')
, esta prueba pasará:
expect(() => functionUnderTest()).toThrow(new TypeError('Something bad happened!'));
La respuesta de bodolsog que sugiere el uso de un try / catch es cercana, pero en lugar de esperar que true sea falso para garantizar que las afirmaciones esperadas en el catch sean acertadas, puede usar expect.assertions(2)
al comienzo de su prueba dónde 2
está el número de afirmaciones esperadas . Siento que esto describe con mayor precisión la intención de la prueba.
Ejemplo completo de prueba del tipo Y mensaje de error:
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()
NO arroja un error, las aserciones serán acertadas pero expect.assertions(2)
fallará y la prueba fallará.