Le test d'une fonction qui a une Promesse et setTimeout, pourquoi est-il expirer?

0

La question

Je suis en train de tester une fonction qui a setTimeout à l'intérieur d'une promesse. Cependant, il continue à l'expiration du délai.

C'est la fonction:

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

Et c'est mon 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");
});

Le problème est que lorsque j'essaie d'exécuter ce que le test échoue et donne ce message:

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

J'ai essayé jest.setTimeout(10000) qui jette juste d'une erreur de Exceeded timeout of 10000ms ...

Aucune idée du pourquoi ce qui se passe? Ou comment résoudre le problème?

Merci!

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

La meilleure réponse

1

Voici une solution qui se rapproche de ce que vous allez pour. Important encore, vous ne pouvez pas await la résolution de la promesse à l'aide de faux minuteries ou il va jamais résoudre. Au lieu de cela, vous pouvez appeler affecter la valeur de retour de la sleep fonction à une variable, puis exécutez les compteurs à zéro, puis attendre la variable.

J'ai également d'ajuster votre expect déclaration pour le délai de spy car il prend deux arguments. Enfin, j'ai supprimé votre expectationt que sleep est appelé à la durée parce que vous êtes littéralement faire que dans le test, il ne semble pas utile de faire cette affirmation.

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

Merci pour votre information, la réponse, c'est ma première fois à l'aide de ces jest minuteries donc j'ai certainement quelques études à faire!
ffx292

Dans d'autres langues

Cette page est dans d'autres langues

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