使用react-testing-library测试React Router v6报嵌套Router错误原因
报错根因
这个错误是重复嵌套渲染了两层BrowserRouter路由实例导致的,React Router v6 明确禁止整个渲染树中出现多个嵌套的路由根容器。
两层Router的来源非常明确:
- 第一层:你编写的
Main组件内部,已经用<BrowserRouter>包裹了路由表配置 - 第二层:测试工具函数
renderWithRouter里,给Testing Library的render方法传入了wrapper: BrowserRouter配置,相当于渲染时在Main组件外层又套了一层路由容器
两层路由实例嵌套就会直接抛出你看到的报错。
修复方法
两种方案二选一即可,核心原则是整个渲染树里只保留一个路由根容器:
- 最小改动方案:保留
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'),不然路由问题修复后测试依然会失败。 - 更规范的项目结构方案:把
Main组件内部的BrowserRouter上移到应用最外层入口(比如main.tsx/App.tsx),让Main组件只负责渲染<Routes>和路由规则,测试时再通过wrapper统一包裹BrowserRouter。这种写法能避免业务组件重复耦合路由容器,后续做路由跳转、权限控制时扩展更方便。
内容的提问来源于stack exchange,提问作者Jenny ler
相关产品推荐
相关产品推荐

