我有一个等待多个承诺的功能

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);
});

10-07 14:08
查看更多