我有一个等待多个承诺的功能
const function = async () => {
await function1()
await function2()
await function3()
}
我想测试一下function3是否被调用:
it(('calls function3', async () => {
jest.spyOn(api, 'function1').mockResolvedValue({})
jest.spyOn(api, 'function2').mockResolvedValue({})
spy = jest.spyOn(api, 'function3')
await function()
expect(spy).toBeCalledTimes(1)
})
并且此测试失败,但是当我打电话等待很多次时:
it(('calls function3', async () => {
jest.spyOn(api, 'function1').mockResolvedValue({})
jest.spyOn(api, 'function2').mockResolvedValue({})
spy = jest.spyOn(api, 'function3')
await await await await await function()
expect(spy).toBeCalledTimes(1)
})
测试将通过。为什么是这样?
await function()
在进入下一个期望行之前难道不应该解决所有的诺言吗?编辑:等待的功能越深,即function4,我需要的等待语句越多,但不是1到1。
最佳答案
将承诺排入微任务队列的顺序是有问题的,我正在使用flush-promises
来解决同一问题。
它使用节点setImmediate
将微任务队列为空时将调用的回调推送到队列。
const flushPromises = require('flush-promises');
test('flushPromises', async () => {
let a;
let b;
Promise.resolve().then(() => {
a = 1;
}).then(() => {
b = 2;
})
await flushPromises();
expect(a).toBe(1);
expect(b).toBe(2);
});