Estoy probando un reloj de cuenta regresiva en mi aplicación React con React Testing Library que muestra un mensaje al final de la cuenta regresiva, y parece que mi uso de jest.advanceTimersByTime hace que la prueba dure entre 6 y 10 segundos...
Me pregunto si hay alguna manera de acelerar esto o si hay otra alternativa para hacer lo mismo.
import MockDate from 'mockdate'; import {addHours} from "date-fns"; import {act, render, screen} from "@testing-library/react"; describe('my tests', () => { beforeAll(() => { MockDate.set('2022-01-01'); jest.useFakeTimers(); }); beforeEach(() => { const endDate = addHours(new Date(), 1); render(<MyAlarm alarm={endDate} />); }); afterEach(() => { act(() => { jest.runOnlyPendingTimers(); }); }); afterAll(() => { jest.useRealTimers(); MockDate.reset(); }); it('Should decrement countdown by 1 second', () => { // Initially 01 hour, 00 minutes expect(screen.queryAllByText('01')).toHaveLength(1); expect(screen.queryAllByText('00')).toHaveLength(1); act(() => { jest.advanceTimersByTime(1000); }); // Should be 00 hours, 59 minutes expect(screen.queryByText('01')).toBeFalsy(); expect(screen.queryAllByText('00')).toHaveLength(1); expect(screen.queryAllByText('59')).toHaveLength(1); }); // Note I have 'fit' to focus on this test solely fit('Should display expired message', () => { // Initially 01 hour, 00 minutes expect(screen.queryAllByText('01')).toHaveLength(1); expect(screen.queryAllByText('00')).toHaveLength(1); expect(screen.queryByText(/EXPIRED/)).toBeFalsy(); act(() => { jest.advanceTimersByTime(60 * 60 * 1000); }); expect(screen.queryByText(/EXPIRED/)).toBeTruthy(); }); })Si ejecuto este conjunto de pruebas, solo ejecutará mi prueba de mensajes caducados, y puedo ver que paso la prueba, sin embargo, parece sugerir que la prueba lleva un tiempo...
APROBADO src/tests/MyTest.spec.js (6,59 s)
Mientras que si ejecuto la suite especificando ejecutar solo la otra prueba, no menciona el tiempo necesario, lo que sugiere que se ejecuta mucho más rápido.