不应该await function()
在进入下一个期望线之前解决所有的承诺?
Yes, await
将等待返回Promise
在继续之前。
这是一个简单的工作示例:
const function1 = jest.fn().mockResolvedValue();
const function2 = jest.fn().mockResolvedValue();
const function3 = jest.fn().mockResolvedValue();
const func = async () => {
await function1();
await function2();
await function3();
}
it('calls function3', async () => {
await func();
expect(function3).toHaveBeenCalled(); // Success!
})
If await
等待的时间没有预期的那么长,那么Promise
链条可能会在某个时候断裂。
这是一个损坏的例子Promise
chain:
const function1 = jest.fn().mockResolvedValue();
const function2 = jest.fn().mockResolvedValue();
const function3 = jest.fn().mockResolvedValue();
const func = async () => {
await function1();
await function2();
await function3();
}
const func2 = async () => {
func(); // <= breaks the Promise chain
}
it('calls function3', async () => {
await func2();
expect(function3).toHaveBeenCalled(); // <= FAILS
})
Calling await
多次会将测试函数的其余部分排队在后面PromiseJobs https://www.ecma-international.org/ecma-262/6.0/#sec-jobs-and-job-queues多次排队,可能会出现待处理的情况Promise
回调有机会运行...
...所以如果将其更改为以下内容,上面的损坏测试将通过:
it('calls function3', async () => {
await await await await func2(); // <= multiple await calls
expect(function3).toHaveBeenCalled(); // Success...only because of multiple await calls
})
...但真正的解决方案是找到并修复问题所在Promise
链条断了:
const func2 = async () => {
await func(); // <= calling await on func fixes the Promise chain
}
it('calls function3', async () => {
await func2();
expect(function3).toHaveBeenCalled(); // Success!
})