React/Jest/Enzyme - 等待时间不够长

2024-04-01

我有一个等待多个承诺的函数

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

这个测试失败了,但是当我多次调用await时:

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()在进入下一个期望线之前解决所有的承诺?

编辑:等待的函数越深,即函数4,我需要的等待语句就越多,但它不是1比1。


不应该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!
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React/Jest/Enzyme - 等待时间不够长 的相关文章

随机推荐