jest中的级联计时器和异步函数



在这个测试代码中,

test('test', async () => {
jest.useFakeTimers();
const cb = jest.fn();
const func = jest.fn().mockResolvedValueOnce(1);
setTimeout(async () => {
setTimeout(() => {
cb();
}, 1000);
}, 1000);
jest.runAllTimers();
});

,因为jest.runAllTimers()模拟了足够的时间,所以cb()被击中。但是在这里,

test('test', async () => {
jest.useFakeTimers();
const cb = jest.fn();
const func = jest.fn().mockResolvedValueOnce(1);
setTimeout(async () => {
await func();
setTimeout(() => {
cb();
}, 1000);
}, 1000);
jest.runAllTimers();
expect(cb).toHaveBeenCalledTimes(1);
});

cb()从未被击中。

我应该如何修改这个测试这段代码,使它正确命中cb和测试通过?

您的计时器在承诺(从func返回)被解决后定义。为了运行那个计时器,你必须等待它被启动。您可以通过等待func返回的承诺来实现。

要访问jest mock函数返回的数据,可以使用它的.mock属性

test('test', async () => {
jest.useFakeTimers();

const cb = jest.fn();
const func = jest.fn().mockResolvedValueOnce(1);

setTimeout(async () => {
await func();
setTimeout(() => {
cb();
}, 1000);
}, 1000);

jest.runAllTimers();
await func.mock.results[0].value
jest.runAllTimers();

expect(cb).toHaveBeenCalledTimes(1);
});