Redux Saga连续put调用单元测试:新增put后测试失败的修复咨询
这种修复方式完全合理,是Redux Saga单元测试的标准操作
Redux Saga的单元测试本质就是手动迭代generator函数的每一个yield步骤——每调用一次generator.next(),就会执行到下一个yield表达式。你在Saga中新增了一个yield put(actionA),相当于给generator多增加了一个执行阶段,原测试中直接跳到actionB的断言自然会失败,因为此时generator停在了新增的actionA步骤上,还没走到actionB。
举个具体的例子帮你理解:
修改前的Saga与测试
// 原Saga function* mySaga() { yield take('TRIGGER_ACTION'); yield call(fetchData); yield put(actionB()); // 最后一个yield } // 原测试 test('should dispatch actionB at the end', () => { const gen = mySaga(); gen.next(); // 执行到take('TRIGGER_ACTION') gen.next(); // 执行到call(fetchData) // 直接断言最后一步 expect(gen.next().value).toEqual(put(actionB())); });
修改后的Saga与修复后的测试
// 修改后的Saga(新增actionA) function* mySaga() { yield take('TRIGGER_ACTION'); yield call(fetchData); yield put(actionA()); // 新增的yield yield put(actionB()); // 现在是最后一个yield } // 修复后的测试(新增一次next()) test('should dispatch actionA then actionB', () => { const gen = mySaga(); gen.next(); // 执行到take('TRIGGER_ACTION') gen.next(); // 执行到call(fetchData) // 先断言新增的actionA expect(gen.next().value).toEqual(put(actionA())); // 再调用一次next(),才能走到actionB的步骤 expect(gen.next().value).toEqual(put(actionB())); });
额外的注意事项
- 建议不要跳过对新增的
actionA的断言,这样既能验证你的修改生效,也能让测试逻辑更完整; - 如果你的Saga有分支逻辑(比如
if/else、while循环),新增yield后要确保所有代码路径的测试都同步更新; - 对于步骤较多的Saga,可以考虑把迭代过程封装成辅助函数,但对于少量步骤,逐个调用
next()是最直观、不易出错的方式。
总的来说,通过新增generator.next()调用适配Saga的修改,完全符合Redux Saga测试的核心逻辑,是非常合理的修复方式。
内容的提问来源于stack exchange,提问作者Omega
相关产品推荐
相关产品推荐

