簡體   English   中英

帶有 Promise 包裝器的 setTimeout 與 Jest async/await 無法按預期工作

[英]setTimeout with Promise wrapper not working as expected with Jest async/await

試圖用玩笑做一個相對簡單的斷言。 我有以下測試設置:

const sleep = ms => new Promise(res => setTimeout(res, ms));

it('should call callback after specified delay', async () => {
  const mockCallback = jest.fn();

  setTimeout(1000, mockCallback);

  expect(mockCallback).not.toHaveBeenCalled();

  await sleep(1000);

  expect(mockCallback).toHaveBeenCalled();
});

當我運行測試失敗並出現以下錯誤時:

Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.

顯然,這遠不及該閾值。 知道我做錯了什么嗎?

[更新] 我之前意識到我在測試前調用了jest.useFakeTimers() 刪除它並再次運行測試后,我仍然失敗,但這不是超時。 而是簡單地

Expected mock function to have been called, but it was not called.

請注意,將睡眠時間顯着增加到 4000 毫秒時也是如此。

如果相反,我從 setTimeout 切換到

sleep(ONE_SECOND)
  .then(mockCallback);

測試通過。 Jest 清楚地修改了 setTimeout 與 Promises 並行交互的方式,但不清楚發生了什么。

您只需要將mockCallback作為第一個參數傳遞給setTimeout

const sleep = ms => new Promise(res => setTimeout(res, ms));

it('should call callback after specified delay', async () => {
  const mockCallback = jest.fn();

  setTimeout(mockCallback, 1000);  // <= pass mockCallback as first argument

  expect(mockCallback).not.toHaveBeenCalled();  // Success!

  await sleep(1000);

  expect(mockCallback).toHaveBeenCalled();  // Success!
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM