Probando una función que tiene una Promesa y setTimeout, ¿por qué es que se agote el tiempo?

0

Pregunta

Estoy tratando de poner a prueba una función que tiene setTimeout en el interior de una promesa. Sin embargo, se mantiene el tiempo de espera.

Esta es la función:

export const sleep = async (duration: number): Promise<void> => {
  await new Promise<void>((resolve) => {
    setTimeout(resolve, duration);
  });

  if (process.env.NODE_ENV === "test") {
    console.log("sleep end");
  }
};

Y esta es mi prueba:

import { sleep } from "../../helpers/utils";

console.log = jest.fn();
jest.useFakeTimers();

test("calls sleep with correct argument and calls console.log", async () => {
  const NODE_ENV = "test";
  const SLEEP_DURATION = "100";

  process.env = { ...process.env, NODE_ENV, SLEEP_DURATION };

  const timeoutSpy = jest.spyOn(global, "setTimeout");

  await sleep(+SLEEP_DURATION);

  jest.runAllTimers();

  expect(sleep).toHaveBeenCalledWith(+SLEEP_DURATION);
  expect(timeoutSpy).toHaveBeenCalledWith(+SLEEP_DURATION);
  expect(console.log).toHaveBeenCalledWith("sleep end");
});

El problema es que cuando intento ejecutar esta la prueba falla y da este mensaje:

thrown: "Exceeded timeout of 5000 ms for a test.
    Use jest.setTimeout(newTimeout) to increase the timeout value, if this is a long-running test."

He probado jest.setTimeout(10000) que apenas lanza un error de Exceeded timeout of 10000ms ...

Alguna idea de por qué está pasando esto? O cómo solucionarlo?

Gracias!

javascript jestjs settimeout timeout
2021-11-24 01:41:50
1

Mejor respuesta

1

He aquí una solución que se acerca más a lo que usted va para. Es importante destacar que, no se puede await la resolución de la promesa utilizando datos falsos o temporizadores nunca voy a resolver. En su lugar, usted puede llamar a asignar el valor de retorno de la sleep la función a una variable, a continuación, ejecute el temporizadores, entonces se espera que la variable.

También he ajustado la expect instrucción para el tiempo de espera de espionaje, ya que toma dos argumentos. Por último, he quitado de tu expectationt que sleep se llama con la duración, porque estás, literalmente, haciendo que en la prueba, por lo que no parece que vale la pena hacer esa afirmación.

console.log = jest.fn();
jest.useFakeTimers();

test("calls sleep with correct argument and calls console.log", async () => {
  const NODE_ENV = "test";
  const SLEEP_DURATION = "100";

  process.env = { ...process.env, NODE_ENV, SLEEP_DURATION };

  const timeoutSpy = jest.spyOn(global, "setTimeout");

  const sleepFn = sleep(+SLEEP_DURATION);

  jest.runAllTimers();

  // Now that we ran timers we can await the promise resolving 
  await sleepFn;

  // timeout takes two arguments
  expect(timeoutSpy).toHaveBeenCalledWith(
    expect.any(Function),
    +SLEEP_DURATION
  );
  expect(console.log).toHaveBeenCalledWith("sleep end");
});
2021-11-24 02:03:50

Gracias por tu respuesta informativa, esta es mi primera vez usando estos broma temporizadores así que definitivamente tengo algunas estudiando para hacer!
ffx292

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................