[英]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.