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

Next.js测试调用useDispatch报未找到react-redux context错误怎么办

问题根因按出现概率从高到低排列:

1. 测试代码未全局注入Provider

该问题仅在测试场景触发是最核心的判断依据:Next.js 正常运行时会走_app.tsx的全局封装逻辑,Provider能正常包裹所有页面组件;但单元/集成测试是单独渲染目标组件,不会加载_app.tsx的全局配置,相当于Home组件在测试环境下是裸渲染,外层没有Provider自然拿不到Redux上下文。

2. react-redux多实例冲突

项目内存在多个版本的react-redux依赖,_app.tsx中引入的Provider和Home组件里调用的useDispatch来自不同的react-redux实例,上下文不互通,导致就算包裹了Provider也无法共享store。

3. store实例异常

_app.tsx中导入的store路径错误、store初始化失败导致传入Provider的是undefined,Provider没有接收到有效store实例,相当于未做包裹。


对应解决方案

测试场景适配

给测试工具封装全局渲染器,内置注入所有全局依赖(Provider、ThemeProvider等),以Jest+React Testing Library为例:

// 新建test-utils.tsx
import { render, RenderOptions } from '@testing-library/react'
import { Provider } from 'react-redux'
import store from './你的store路径'
import { ThemeProvider } from '@mui/material/styles'
import Theme from './你的主题配置路径'

const GlobalWrapper = ({ children }) => {
  return (
    <Provider store={store}>
      <ThemeProvider theme={Theme}>
        {children}
      </ThemeProvider>
    </Provider>
  )
}

const customRender = (
  ui: React.ReactElement,
  options?: Omit<RenderOptions, 'wrapper'>
) => render(ui, { wrapper: GlobalWrapper, ...options })

export * from '@testing-library/react'
export { customRender as render }

后续所有测试文件都从该test-utils导入render方法即可,无需每个测试单独包裹Provider。

排查依赖版本

执行命令检查react-redux版本:

npm ls react-redux
# 用yarn的话执行 yarn list react-redux

如果输出多个版本,在package.json中添加resolutions配置强制统一版本:

{
  "resolutions": {
    "react-redux": "你项目使用的版本号"
  }
}

重新安装依赖即可。

检查store实例

在_app.tsx中打印导入的store,确认是有效Redux实例而非undefined,修正导入路径即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:54:05