es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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í?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para realizar correctamente la prueba de la promesa rechazada, puedes utilizar el método mockRejectedValue de jest.fn() para simular la llamada fetch() y devolver una promesa rechazada con el mensaje de error esperado. Aquí tienes una versión actualizada de la prueba en Jest:

    const fetchMock = require('jest-fetch-mock');
    jest.setMock('node-fetch', fetchMock);
    
    describe('fetchCars', () => {
      it('should handle failed API calls', async () => {
        fetchMock.mockRejectedValue({ ok: false });
    
        await expect(fetchCars(1)).rejects.toEqual(new Error('La llamada a la API falló'));
    
        expect(fetchMock.mock.calls.length).toBe(1);
        expect(fetchMock.mock.calls[0][0]).toBe('/ruta/al/endpoint/1');
      });
    });
    

    En esta prueba, primero importamos y configuramos jest-fetch-mock para simular la función fetch(). Luego, llamamos a fetchMock.mockRejectedValue() con un objeto que tiene la propiedad ok establecida en false para simular una llamada fallida a la API. Luego, utilizamos expect().rejects.toEqual() para asegurarnos de que fetchCars() devuelva una promesa rechazada con un mensaje de error de “La llamada a la API falló”. Por último, usamos algunas afirmaciones adicionales para comprobar que fetch() fue llamado con la URL correcta.

    Ten en cuenta que ya no estamos utilizando request() en la función fetchCars(), así que asegúrate de actualizar tu código en consecuencia.

Comments are closed.