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 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.

Tags:  , ,

Answer

  1. Avatar for 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 utilizando jest.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 a setTimeout, debes utilizar el objeto espía para simular setTimeout y asegurarte de que se esté llamando con los argumentos correctos. Por ejemplo:

    describe("miFuncion", () => {
      const timeoutSpy = jest.spyOn(window, "setTimeout");
    
      afterEach(() => {
        timeoutSpy.mockClear();
      });
    
      it("debería llamar a setTimeout con los argumentos correctos", () => {
        miFuncion();
        expect(timeoutSpy).toHaveBeenCalledTimes(1);
        expect(timeoutSpy).toHaveBeenCalledWith(expect.any(Function), 1000);
      });
    });
    

    En este ejemplo, definimos un objeto espía para setTimeout globalmente y utilizamos afterEach para limpiar la simulación después de cada prueba. Luego, probamos que miFuncion está llamando a setTimeout 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étodo mockClear en un bloque afterEach. 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.

Comments are closed.