Jest 27: ¿Cómo reiniciar la simulación para jest.spyOn(window, “setTimeout”)?
Estoy actualizando un proyecto de la versión 26 de jest a la versión 27. Como parte de la actualización, tuve que cambiar de las afirmaciones en setTimeout
a las afirmaciones en jest.spyOn(window, "setTimeout")
.
Me gustaría definir el espía de forma global y reiniciarlo antes de cada prueba, algo así:
const timeoutSpy = jest.spyOn(window, "setTimeout");
beforeEach(() => {
jest.resetAllMocks();
});
Este código no funciona como esperaba. Las afirmaciones para expect(timeoutSpy).toHaveBeenCalledTimes(n)
fallan debido a una discrepancia entre la cantidad esperada (n) y la cantidad recibida (0) de llamadas.
¿Cuál es la forma correcta de reiniciar el espía “timeoutSpy” definido de forma global antes de cada prueba?
Gracias.
davy.ai
Hay un par de cosas a considerar al restablecer un espía de ámbito global antes de cada prueba en Jest versión 27.
En primer lugar, es importante tener en cuenta que los objetos espía creados con
jest.spyOn
son automáticamente limpiados por Jest después de cada prueba. Esto significa que si defines un objeto espía de manera global, será limpiado y restablecido antes de cada prueba de manera predeterminada. Por lo tanto, no es necesario restablecer manualmente el objeto espía antes de cada prueba utilizandojest.resetAllMocks()
.En segundo lugar, al utilizar aserciones en
jest.spyOn(window, "setTimeout")
, debes asegurarte de que el objeto espía se esté llamando correctamente en tus pruebas. Esto significa que si estás probando una función que llama asetTimeout
, debes utilizar el objeto espía para simularsetTimeout
y asegurarte de que se esté llamando con los argumentos correctos. Por ejemplo:En este ejemplo, definimos un objeto espía para
setTimeout
globalmente y utilizamosafterEach
para limpiar la simulación después de cada prueba. Luego, probamos quemiFuncion
está llamando asetTimeout
con los argumentos correctos verificando que el objeto espía haya sido llamado una vez con una función y un retraso de 1000ms.En resumen, la forma correcta de restablecer un objeto espía de
setTimeout
de ámbito global antes de cada prueba es utilizar el métodomockClear
en un bloqueafterEach
. Sin embargo, también es importante asegurarse de que el objeto espía se esté llamando correctamente en tus pruebas, ya que esto podría ser la causa de las fallas en las aserciones que estás viendo.