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

Jest中使用useContext读取初始状态失败问题求助

修复Jest/React Testing Library测试中useContext解构initialState的undefined错误

错误信息

Error: Uncaught [TypeError: Cannot read properties of undefined (reading 'initialState')]

问题根源

  1. mockReducer返回值无效:useReducer会返回[state, dispatch]数组,但你用jest.fn()创建的mockReducer默认返回undefined,导致StateProvider的value变成[undefined, undefined],组件解构[{ initialState }, dispatch]时第一个元素是undefined,自然读取不到initialState。
  2. 测试变量名不匹配:你定义了prop1等变量,但渲染组件时误用了mockProp1这类未定义的变量,会引发额外错误。

修复方案

方案1:修复mockReducer并修正变量名

修改测试文件中的mockReducer,让它返回正确的state,同时修正变量名:

// Component.test.tsx
describe("Component", () => {
  it("should render correctly", () => {
    const prop1 = "prop1";
    const prop2 = "prop2"
    const prop3 = "prop3"
    // 让mockReducer返回传入的state,保证useReducer能拿到有效state
    const mockReducer = jest.fn((state) => state);
    const mockContext = {
      initialState: [{ id: "" }]
    }

    render(
      <StateProvider initialState={mockContext} reducer={mockReducer}>
        <Component
          prop1={prop1}
          prop2={prop2}
          prop3={prop3}
        />
      </StateProvider>
    );
  });
});

如果需要测试特定action逻辑,可以给mockReducer添加对应处理:

const mockReducer = jest.fn((state, action) => {
  switch(action.type) {
    case 'ADD_ITEM':
      return { ...state, initialState: [...state.initialState, action.payload] };
    default:
      return state;
  }
});

方案2:直接mock useStateValue钩子(更轻量)

如果不想依赖StateProvider的实现,可以直接mock自定义的useStateValue钩子,简化测试:

// Component.test.tsx
import { useStateValue } from './StateProvider';
// 提前mock钩子
jest.mock('./StateProvider', () => ({
  useStateValue: jest.fn(() => [
    { initialState: [{ id: "" }] }, // 模拟组件需要的state
    jest.fn() // 模拟dispatch函数
  ])
}));

describe("Component", () => {
  it("should render correctly", () => {
    const prop1 = "prop1";
    const prop2 = "prop2"
    const prop3 = "prop3"

    // 无需包裹StateProvider,直接渲染组件
    render(<Component prop1={prop1} prop2={prop2} prop3={prop3} />);
    
    // 后续可添加断言,比如检查组件渲染内容
  });
});

内容的提问来源于stack exchange,提问作者emptyfullstack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:18:22