Testovanie funkcia, ktorá má Sľub a setTimeout, prečo je to časového?

0

Otázka

Snažím sa testuje funkciu, ktorá má setTimeout vo vnútri sľub. To však vedie načasovanie von.

Je to funkcia:

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

A toto je môj 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");
});

Problém je, že keď sa snažím spustiť tento test zlyhá a dáva túto správu:

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

Snažil som sa jest.setTimeout(10000) čo práve hodí chybu Exceeded timeout of 10000ms ...

Nejakú predstavu, ako, prečo sa to deje? Alebo, ako to opraviť?

Vďaka!

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

Najlepšiu odpoveď

1

Tu je riešenie, ktoré sa dostáva bližšie na to, čo pre vás chystáme. Dôležité je, že nemôžete await rozlíšenie sľub pomocou falošné merače času alebo ju nikdy vyriešiť. Namiesto toho môžete volať priradiť vrátiť hodnotu sleep funkcia premennej, potom spustite hovorov, potom čakajú premennej.

Som upravila svoje expect ziskov a strát za časový interval, spy, pretože to trvá dva argumenty. Nakoniec som odstránil vaše expectationt, že sleep dostane tzv s dĺžkou pretože ste doslova v tom, že v teste, tak to nezdá vhodné, aby toto tvrdenie.

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

Vďaka za vašu informatívne odpoveď, toto je môj prvý pomocou týchto žart merače času, takže som určite nejaké štúdium robiť!
ffx292

V iných jazykoch

Táto stránka je v iných jazykoch

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