การทดสอบฟังก์ชั่นซึ่งเป็นสัญญาและ setTimeout,ทำไมมันถึงเวลาออก?

0

คำถาม

ฉันพยายามจะทดสอบฟังก์ชันที่มี setTimeout ข้างในเป็นสัญญา แต่มันทำให้เวลานออกมา

นี่คือการตรวจสอบสิทธิ์

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

และนี่คือของฉันทดสอบ:

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

ปัญหาก็คือตอนที่ฉันพยายามจะวิ่งนี้การทดสอบความผิดพลาดและทำให้ข้อความนี้:

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

ฉันพยายาม jest.setTimeout(10000) ซึ่งก็แค่โยเกิดข้อผิดพลาดของ Exceeded timeout of 10000ms ...

รู้มั้ยว่าทำไมแม่คนนี้ถึงเกิดขึ้น? หรือว่าต้องแก้ไขมันได้หรือเปล่า?

ขอบคุณ!

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

คำตอบที่ดีที่สุด

1

นี่คือวิธีแก้ปัญหานั้นได้ใกล้ชิดกับสิ่งที่คุณกำลังจะไป อย่างที่สำคัญคุณไม่สามารถ await ที่ความละเอียดของสัญญาการใช้ปลอมซิงหรือมันจะไม่มีวันวามมุ่งมั่น แทนที่จะเป็นคุณสามารถเรียกกำหนดการหวนคืนค่าของคน sleep ฟังก์ชันจะเป็นตัวแปรนั้นหนีไปซิแล้วรอคำตัดสินจากกองตัวแปร

ผมยังปรับตัวของคุณ expect แถลงการณ์สำหรับหมดเวลานสายลับตั้งแต่มันต้องใช้อาร์กิวเมนต์สองคน. ในที่สุดฉันถูกเอาออกของคุณ expectationt นั้น sleep ได้ชื่อกับช่วงเวลาเพราะคุณจริงทำอย่างนั้นในการทดสอบดังนั้นมันไม่เหมือนสิ่งคุ้มที่จะทำให้มัน assertion.

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

ขอบคุณสำหรับของคุณได้รับข้อมูลมากเลยทีเดีคำตอบนี่เป็นครั้งแรกที่ฉันใช้พวกนี้ jest ซิดังนั้นฉันอย่างแน่นอนมีบางอย่าเรียนต้องทำยังไง!
ffx292

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่