我需要测试(Jest)一个Redux中间件,它检索并发送一系列以前保存的动作。它使用'await'运算符,以便按顺序完成操作。
这在运行中有效,但在测试中,只从序列中的第一个动作从已保存的数组中弹出并调度。
我尝试过在Redux文档中找到的模式的多种变体,包括使用redux-mock-store,没有任何乐趣。我是Jest的新手(以及一般的React / Redux单元测试),这也是我在中间件上的第一次破解。我觉得它的循环结构阻止了测试的迭代,但是我无法解决这个问题。
中间件的内容看起来像这样:
//there are 3 saved actions in the test
const actions = getState().actions
while (actions.length > 0) {
const action = actions.pop()
await Promise.resolve(next(action))
.then(()=>{
console.log('this hits 3 times')
})
}
我最初尝试的天真尝试是这样的:
it(`dispatches all saved actions on request`, () => {
_values['state'].rewind = {
actions: {
abcdef: [
{ type: 'TEST', payload: { value: 'rewind value 1' }},
{ type: 'TEST', payload: { value: 'rewind value 2' }},
{ type: 'TEST', payload: { value: 'rewind value 3' }}]
}
}
const action = createTriggerAction('abcdef')
const { next, store, invoke } = create() // spy/mocks as in Redux Docs
invoke(action)
expect(next).toHaveBeenCalledTimes(3); // fails, called only once
})
我混淆了'调用'一个异步函数和'等待'模拟'下一个'等但没有帮助。
关于如何做到这一点的任何指示都将非常感激!