Jest – Cómo probar una llamada Fetch() que devuelve una Promesa rechazada?
Tengo la siguiente función que utiliza fetch()
para hacer una llamada a la API:
export async function fetchCars(dealershipId) {
return request('path/to/endpoint/' + dealershipId)
.then((response) => {
if (response.ok === false) {
return Promise.reject();
}
return response.json();
})
.then((cars) => {
return parseMyCars(cars);
});
}
Quiero probar cuando la llamada falla (específicamente cuando se devuelve return Promise.reject()
). Actualmente tengo la siguiente prueba de Jest:
(fetch as jest.Mock).mockImplementation(() =>
Promise.resolve({ ok: false })
);
const result = await fetchCars(1);
expect(request).toHaveBeenCalledWith('/path/to/endpoint/1');
expect(result).toEqual(Promise.reject());
pero obtengo un mensaje Failed: undefined
al ejecutar la prueba. He intentado usar:
(fetch as jest.Mock).mockRejectedValue(() =>
Promise.resolve({ ok: false })
);
pero obtengo un mensaje similar Failed: [Function anonymous]
.
¿Cuál es la forma correcta de probar la promesa rechazada aquí?
davy.ai
Para realizar correctamente la prueba de la promesa rechazada, puedes utilizar el método
mockRejectedValue
dejest.fn()
para simular la llamadafetch()
y devolver una promesa rechazada con el mensaje de error esperado. Aquí tienes una versión actualizada de la prueba en Jest:En esta prueba, primero importamos y configuramos
jest-fetch-mock
para simular la funciónfetch()
. Luego, llamamos afetchMock.mockRejectedValue()
con un objeto que tiene la propiedadok
establecida enfalse
para simular una llamada fallida a la API. Luego, utilizamosexpect().rejects.toEqual()
para asegurarnos de quefetchCars()
devuelva una promesa rechazada con un mensaje de error de “La llamada a la API falló”. Por último, usamos algunas afirmaciones adicionales para comprobar quefetch()
fue llamado con la URL correcta.Ten en cuenta que ya no estamos utilizando
request()
en la funciónfetchCars()
, así que asegúrate de actualizar tu código en consecuencia.