Uso de temporizadores falsos
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
En algunos casos, cuando tu código utiliza temporizadores (setTimeout, setInterval, clearTimeout, clearInterval), tus pruebas pueden volverse impredecibles, lentas y frágiles.
Para resolver estos problemas, o si necesitas depender de marcas de tiempo específicas en tu código, la mayoría de frameworks de pruebas ofrecen la opción de reemplazar los temporizadores reales en tus pruebas con versiones falsas. Esto tiene un efecto secundario: cuando usas temporizadores falsos en tus pruebas, todo el código dentro de tu prueba utiliza temporizadores falsos.
El patrón común para configurar temporizadores falsos suele hacerse dentro del beforeEach, por ejemplo:
// Fake timers using Jest
beforeEach(() => {
jest.useFakeTimers()
})
Dado que los temporizadores falsos simulan funciones nativas de temporizadores, es necesario restaurarlos después de ejecutar cada prueba, al igual que con los mocks convencionales. Esto evita que los temporizadores falsos se filtren hacia otros casos de prueba y funciones de limpieza, donde se esperan temporizadores reales.
Para esto normalmente se llama a useRealTimers en el afterEach.
Es importante también llamar a runOnlyPendingTimers antes de cambiar a temporizadores reales. Esto asegura que se procesen todos los temporizadores pendientes antes del cambio. Si no avanzas los temporizadores y simplemente cambias a temporizadores reales, las tareas programadas no se ejecutarán y obtendrás un comportamiento inesperado. Esto es especialmente relevante para terceros que programan tareas sin tu conocimiento.
Aquí tienes un ejemplo de cómo hacerlo usando jest:
// Running all pending timers and switching to real timers using Jest
afterEach(() => {
jest.runOnlyPendingTimers()
jest.useRealTimers()
})
Combinar temporizadores falsos con user-event puede causar tiempos de espera en las pruebas. Consulta la opción advanceTimers para prevenir este problema.