gpt4 book ai didi

javascript - 带有 Promise 包装器的 setTimeout 无法按预期使用 Jest async/await

转载 作者:行者123 更新时间:2023-11-29 23:00:57 26 4
gpt4 key购买 nike

尝试用 Jest 做一个相对简单的断言。我有以下测试设置:

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.

请注意,当 sleep 时间显着增加到 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!
});

关于javascript - 带有 Promise 包装器的 setTimeout 无法按预期使用 Jest async/await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55668630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com