You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redux Toolkit Reducer测试异常问题求助

问题分析:Redux Toolkit Reducer测试中缺少ID的原因及解决办法

你遇到的问题核心很明确:你在测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 23:58:09