我正在测试包含异步功能的代码。即使在测试不使用等待的流时,测试也会失败。当我删除async / await(这是可能的,因为测试的流程不需要它)时,测试通过。
我已经构建了代码和测试的简化示例。
(1)使用async / await的代码示例(尽管不需要,如我的测试流程所示):
const textRange as GoogleAppsScript.Slides.TextRange;
textRange.getRange(start, end).select();
(2)没有异步/等待的相同代码:
import React from 'react'
export class Example extends React.Component {
state = { first: false }
async func1 () {
const selection = await this.func2()
this.setState({ first: selection })
}
async func2 () {
return true
}
render () {
return null
}
}
这是测试(1)失败(第三个import React from 'react'
export class Example extends React.Component {
state = { first: false }
func1 () {
const selection = this.func2()
this.setState({ first: selection })
}
func2 () {
return true
}
render () {
return null
}
}
失败)并通过(2)的测试。知道为什么以及如何编写测试,以便使用async / await进行代码工作吗?
expect
答案 0 :(得分:0)
您能否说明测试失败的期望是什么?是第一个期望还是第二个期望?
我能想到的一件事是,由于jest自然会同步测试功能,因此,如果要测试的功能中包含异步代码,则它们将在测试功能结束时的调用堆栈之后发生。相反,您将需要添加
expect.assertions(2);
在测试功能的开头,因此它等待异步功能完成运行。
答案 1 :(得分:0)
您可能遇到this问题,其中的承诺没有兑现。
尝试将更新测试用例添加到以下内容
describe('Testing Example', () => {
function flushPromises() {
return new Promise(resolve => setImmediate(resolve));
}
it('calls func1 properly', async () => {
wrapper = shallow(
<Example />
)
const instance = wrapper.instance()
const prevState = { first: false }
const expectedState = { first: true }
expect.assertions(2)
expect(instance.state).toEqual(prevState)
await instance.func1()
await flushPromises();
expect(instance.state).toEqual(expectedState)
})
});