O teste de uma função que possui uma Promessa e setTimeout, por que é o tempo limite?

0

Pergunta

Eu estou tentando testar uma função que tem setTimeout dentro de uma promessa. No entanto, ele mantém o tempo limite.

Esta é a função:

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 este é o meu teste:

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

O problema é que quando eu tento executar este teste falhar e dá esta mensagem:

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

Eu tentei jest.setTimeout(10000) o que só lança um erro de Exceeded timeout of 10000ms ...

Qualquer idéia a respeito de por que isso está acontecendo? Ou como corrigi-lo?

Obrigado!

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

Melhor resposta

1

Aqui está uma solução que se aproxima ao que você está indo para. Importante, você não pode await a resolução da promessa de falsos usando os temporizadores ou ela nunca vai resolver. Em vez disso, você pode chamar atribuir o valor de retorno do sleep função de uma variável e, em seguida, executar os temporizadores, em seguida, aguardar a variável.

Eu também ajustado o seu expect instrução para o tempo limite de espião, pois tem dois argumentos. Finalmente, tirei sua expectationt que sleep é chamada com a duração, porque você está, literalmente, fazendo que, no teste, portanto, não parece que vale a pena fazer essa afirmação.

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

Obrigado por seu informativo resposta, esta é a minha primeira vez usando esses brincadeira temporizadores, então eu definitivamente tenho algumas estudando para fazer!
ffx292

Em outros idiomas

Esta página está em outros idiomas

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