Estoy trabajando con algún código donde necesito probar el tipo de excepción lanzada por función (¿Es TypeError, ReferenceError, etc.).
Mi marco de prueba actual es AVA y puedo probarlo como un segundo t.throws
método de argumento , como aquí:
it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', (t) => {
const error = t.throws(() => {
throwError();
}, TypeError);
t.is(error.message, 'UNKNOWN ERROR');
});
Comencé a reescribir mis pruebas a Jest y no pude encontrar cómo hacerlo fácilmente. ¿Es posible?
fuente
expect('here').not.toBe('here');
por diversión :-)expect('to be').not.toBe('to be')
en estilo Shakespeare.Yo uso una versión un poco más concisa:
fuente
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ónde2
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:
Si
functionUnderTest()
NO arroja un error, las aserciones serán acertadas peroexpect.assertions(2)
fallará y la prueba fallará.fuente
expect.hasAssertions()
podría ser una mejor alternativa cuando la prueba no tiene ninguna afirmación fueracatch
, porque no tiene que actualizar el número si agrega / elimina afirmaciones.No lo he intentado yo mismo, pero sugeriría usar la afirmación de Jest para lanzar . Así que supongo que su ejemplo se vería así:
De nuevo, no lo he probado, pero creo que debería funcionar.
fuente
Jest tiene un método
toThrow(error)
para probar que una función se lanza cuando se llama.Entonces, en su caso, debería llamarlo así:
Los documentos
fuente
jest.spyOn(service, 'create').mockImplementation(() => { throw new Error(); });
si el método burladocreate
no lo esasync
.La broma moderna le permite hacer más controles sobre el valor rechazado. Por ejemplo:
fallará con error
fuente
La documentación es clara sobre cómo hacer esto. Digamos que tengo una función que toma dos parámetros y arrojará un error si uno de ellos es
null
.Su prueba
fuente
En caso de que esté trabajando con
Promise
s:fuente
Terminé escribiendo un método de conveniencia para nuestra biblioteca test-utils
fuente
Además de la publicación de Peter Danis, solo quería enfatizar la parte de su solución que involucra "[pasar] una función a esperar (función) .toThrow (en blanco o tipo de error)".
En Jest, cuando prueba un caso en el que debe arrojarse un error, dentro de su ajuste de la función que se espera (), debe proporcionar una capa adicional de ajuste de la función de flecha para que funcione. Es decir
Incorrecto (pero el enfoque lógico de la mayoría de las personas):
Correcto:
Es muy extraño, pero debería hacer que la prueba se ejecute con éxito.
fuente
tratar
expect(t).rejects.toThrow()
fuente
try
? no hay prueba, sino respuesta. Si esta es la respuesta, por favor elabore más. ¿Qué agregas a la respuesta existente?