在这个测试代码中,
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);
});