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

Jest测试套件TypeError问题:ReactReduxContext模拟时displayName设置异常

解决Jest测试中ReactReduxContext模拟的TypeError问题

你遇到的TypeError: Cannot set properties of undefined (setting 'displayName')错误,核心原因是jest.requireActual('react-redux').ReactReduxContext返回了undefined,导致无法对不存在的对象扩展属性。

以下是几种可行的解决方法:

1. 确认React-Redux版本的导出结构

不同版本的react-redux导出路径可能有变化,比如v8+版本中,ReactReduxContext的导出逻辑和旧版本不同。可以先在测试文件中打印实际导出内容,确认是否存在该属性:

console.log(jest.requireActual('react-redux'));

如果确实找不到ReactReduxContext,可以直接创建一个全新的模拟上下文对象:

import React from 'react';

// 模拟ReactReduxContext
ReactReduxContext: React.createContext({
  store: {
    getState: () => ({})
    // 根据组件需求添加其他必要的store方法,比如dispatch、subscribe等
  }),
  displayName: 'MockedReactReduxContext'
})

2. 给扩展操作加兜底判断

如果需要保留基于实际上下文扩展的逻辑,可以先判断原上下文是否存在,不存在则用空对象兜底:

const actualReactRedux = jest.requireActual('react-redux');
ReactReduxContext: {
  ...(actualReactRedux.ReactReduxContext || {}),
  displayName: 'MockedReactReduxContext'
}

这样即使原上下文是undefined,扩展空对象也不会触发错误。

3. 使用官方推荐的测试方式

React-Redux官方更推荐通过Provider组件配合模拟store来测试组件,而非直接操作内部上下文。这种方式更稳定且符合最佳实践:

import { Provider } from 'react-redux';
import { render } from '@testing-library/react';
import YourComponent from './YourComponent';

// 模拟store对象
const mockStore = {
  getState: () => ({ /* 填入你的模拟state数据 */ }),
  subscribe: jest.fn(),
  dispatch: jest.fn()
};

// 用Provider包裹组件进行渲染测试
render(
  <Provider store={mockStore}>
    <YourComponent />
  </Provider>
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:08:19