Testování funkce, která má Slib a setTimeout, proč je to načasování?

0

Otázka

Snažím se testovat funkci, která má setTimeout uvnitř slib. Nicméně to stále načasování.

To je funkce:

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 tohle 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 když zkusím spustit test selže a dává tuto zprá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 jsem se jest.setTimeout(10000) který jen hází chybu Exceeded timeout of 10000ms ...

Nějaký nápad, proč se to děje? Nebo jak to opravit?

Díky!!!

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

Nejlepší odpověď

1

Zde je řešení, které dostane blíže k tomu, co budete pro. Důležité je, že nemůžete await usnesení slib pomocí falešné časovače nebo to nikdy vyřešit. Místo toho, můžete volat přiřadit návratovou hodnotu sleep funkce do proměnné, pak spustit časovače, pak čekají proměnné.

Já také upravit vaše expect prohlášení pro timeout spy, protože to trvá dva argumenty. Nakonec jsem sundal expectationt, že sleep dostane tzv. s dobou, protože jsi doslova dělat, že v testu, takže to nevypadá, že stojí za to, aby se toto tvrzení.

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

Díky za poučnou odpověď, tohle je moje první čas pomocí těchto žertu časovače, takže já určitě musím učit!
ffx292

V jiných jazycích

Tato stránka je v jiných jazycích

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