Tenemos una función en nuestro proyecto React para obtener una lista de tiendas. Si la recuperación tarda más de 10 segundos, abortamos la solicitud y mostramos un error.
const controller = new AbortController(); const getTimeout = setTimeout(() => controller.abort(), 10000); const fetchStores = storeId => ( ourFetchStoresFunction(`http://my-api/${storeId}`, { headers: { 'x-block': 'local-stores' }, signal: controller.signal }) .then((results) => { clearTimeout(getTimeout); return results }) .catch((err) => { throw err; }) ); Aquí está la prueba básica para la función fetchStores :
it('fetchStores should return a stores array', () => { storesAPI.fetchStores(MOCK_STORES) .then((stores) => { expect(Array.isArray(stores)).toBe(true); }) .catch(); });¿Cómo me burlo de este tiempo de espera en Jest?
usar setTimeout en el bloque .then al llamar a ese método no funcionó. Además, preferiría NO tener que esperar 10 segundos durante la prueba. Busqué jest.useFakeTimers pero no llegué a ninguna parte.
Podría probar los temporizadores globales, lea aquí: jestjs.io/docs/timer-mocks Puede usar la función jest spyOn. Por ejemplo:
let timeoutSpy; beforeEach(() => { timeoutSpy = jest.spyOn(global, 'setTimeout'); }); afterEach(() => { jest.restoreAllMocks(); })
Luego, en su prueba, puede esperar (tymepoutSpy).toHaveBeenCalledTimes(1); Algo como esto debería funcionar, funcionó en mi caso.
En su caso, también puede burlarse del controlador, nuevamente usando jest.spyOn, podría ser algo como esto:
let abortSpy;
En el mismo beforeEach puedes configurarlo:
abortSpy = jest.spyOn(AbortController.prototype, 'abort');
Y supongo que nuestra función FetchStoresFunction es similar a fetch.
Y finalmente, puede simular la función de búsqueda, por lo que lleva mucho tiempo cargar, se puede hacer de esta manera:
> global.fetch = jest.fn(() => Promise.resolve({ // set some time }) > );