Il test di una funzione che ha una Promessa e setTimeout, perché è il timeout?

0

Domanda

Sto cercando di testare una funzione che ha setTimeout all'interno di una promessa. Tuttavia mantiene il timeout.

Questa è la funzione:

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");
  }
};

E questo è il mio test:

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");
});

Il problema è che quando cerco di eseguire questo test ha esito negativo e dà questo messaggio:

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

Ho provato jest.setTimeout(10000) che getta un errore di Exceeded timeout of 10000ms ...

Qualche idea del perché questo sta accadendo? O come risolvere il problema?

Grazie!

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

Migliore risposta

1

Ecco una soluzione che si avvicina a quello che stai andando per. Soprattutto, non è possibile await la risoluzione della promessa utilizzando falsi timer o non sarà mai risolvere. Invece, è possibile chiamare assegnare il valore di ritorno della sleep funzione di una variabile, quindi eseguire il timer, poi attendere la variabile.

Ho anche impostato il vostro expect dichiarazione per il periodo di timeout spia dal momento che accetta due argomenti. Infine, ho rimosso il tuo expectationt che sleep viene chiamato con la durata, perché si sta letteralmente facendo il test, quindi non valeva la pena di fare tale affermazione.

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

Grazie per l'interessante risposta, questa è la mia prima volta con queste boutade timer così ho sicuramente qualche studiando per fare!
ffx292

In altre lingue

Questa pagina è in altre lingue

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