Redux Toolkit Reducer测试异常问题求助
你遇到的问题核心很明确:你在测试reducer时手动构造了action对象,完全绕开了Redux Toolkit的prepare函数,所以payload里根本不会生成ID。
为什么会这样?
Redux Toolkit里的prepare函数是和对应的action creator绑定在一起的——只有当你通过addExpense这个自动生成的action creator来创建动作时,prepare才会被调用,它会帮你处理payload(生成ID、设置默认值),然后再把处理后的payload传给reducer。
而你在测试reducer时,直接手动写了一个{ type: 'expenses/addExpense', payload: newExpense }的action对象,这个过程完全没有触发prepare函数,所以reducer收到的payload就是你传入的原始对象,自然没有id字段。
解决办法
最简单也最符合Redux Toolkit设计思路的方案,就是使用生成的action creator来创建测试用的action,而不是手动构造。修改你的测试代码如下:
describe('Expense Reducer', () => { it('should add an expense', () => { const newExpense = { description: 'my new expense', amount: 1000, createdAt: 0, note: 'this is a note' } // 用addExpense action creator生成正确的action,自动触发prepare函数 const action = addExpense(newExpense) const state = expenseReducer([], action) expect(state).toEqual([ { id: expect.any(String), description: 'my new expense', amount: 1000, createdAt: 0, note: 'this is a note' } ]) }) })
这样修改后,action creator会自动调用prepare函数,给payload加上随机生成的ID,同时处理默认值逻辑,reducer收到的就是完整的费用对象,测试就能顺利通过了。
额外说明
如果你只是想单独测试reducer的纯逻辑(比如验证它能正确把新对象添加到数组里),那你可以手动给payload加上id再传给reducer,但这种测试场景只针对reducer本身,而不是完整的“添加费用”业务流程。你的测试目标显然是验证完整流程,所以使用action creator才是正确的选择。
内容的提问来源于stack exchange,提问作者RemiM

