Testarea o funcție care are o Promisiune și setTimeout, de ce este calendarul?

0

Problema

Am încercat să testeze o funcție care are setTimeout în interiorul o promisiune. Cu toate acestea se păstrează calendarul afară.

Aceasta este funcția:

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

Și acest lucru este testul meu:

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

Problema este că atunci când am încercați să executați această încercare eșuează și dă acest mesaj:

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

Am încercat jest.setTimeout(10000) care doar aruncă o eroare de Exceeded timeout of 10000ms ...

Orice idee de ce se întâmplă acest lucru? Sau cum să o rezolvi?

Multumesc!!!

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

Cel mai bun răspuns

1

Aici este o soluție care se apropie de ceea ce ai de gând pentru. Important, nu te poți await rezoluția de promisiunea folosind fals cronometre sau nu se va mai rezolva. În schimb, puteți apela atribui valoarea de returnare a sleep funcție de o variabilă, apoi executați cronometre, apoi așteaptă variabilă.

Am, de asemenea, ajustate de dvs. expect declarație pentru timeout spion deoarece este nevoie de două argumente. În cele din urmă, am scos expectationt care sleep este chemat cu durata pentru că ești literalmente face că, în test, deci nu mi se pare util pentru a face această afirmație.

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

Mulțumesc pentru răspuns informativ, aceasta este prima mea timp folosind aceste jest cronometre, astfel încât am avea cu siguranta ceva de învățat!
ffx292

În alte limbi

Această pagină este în alte limbi

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