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

使用react-testing-library测试React Router v6报嵌套Router错误原因

报错根因

这个错误是重复嵌套渲染了两层BrowserRouter路由实例导致的,React Router v6 明确禁止整个渲染树中出现多个嵌套的路由根容器。
两层Router的来源非常明确:

  • 第一层:你编写的Main组件内部,已经用<BrowserRouter>包裹了路由表配置
  • 第二层:测试工具函数renderWithRouter里,给Testing Library的render方法传入了wrapper: BrowserRouter配置,相当于渲染时在Main组件外层又套了一层路由容器
    两层路由实例嵌套就会直接抛出你看到的报错。

修复方法

两种方案二选一即可,核心原则是整个渲染树里只保留一个路由根容器:

  1. 最小改动方案:保留Main组件内部的BrowserRouter,删掉测试工具里的wrapper配置
    修改后的测试工具代码:
    const renderWithRouter = (ui: React.ReactElement, { route = '/' } = {}) => {
      window.history.pushState({}, 'Test page', route)
    
      return {
        user,
        ...render(ui), // 移除wrapper: BrowserRouter配置
      }
    }
    
    额外注意:你的测试用例里写的是查找文本about,但组件里实际渲染的是首字母大写的About,这处也要同步改成await screen.findByText('About'),不然路由问题修复后测试依然会失败。
  2. 更规范的项目结构方案:把Main组件内部的BrowserRouter上移到应用最外层入口(比如main.tsx/App.tsx),让Main组件只负责渲染<Routes>和路由规则,测试时再通过wrapper统一包裹BrowserRouter。这种写法能避免业务组件重复耦合路由容器,后续做路由跳转、权限控制时扩展更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:01:58