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

React Router V5迁移至V6:测试工具函数失效问题求助

迁移至React Router V6后测试工具函数故障,所有断言失败

我正在把项目迁移到React Router V6,但测试工具函数出了问题。运行测试时所有断言都失败,Jest找不到目标元素。有没有人遇到过类似的迁移问题或者知道原因?

提前感谢!

我的TestUtils文件

/* eslint-disable no-console */
import React, { ReactElement, ReactNode } from 'react'

import { render } from '@testing-library/react'
import { I18nextProvider } from 'react-i18next'
import { QueryClientProvider, setLogger, QueryClient } from 'react-query'
import { Route, MemoryRouter, Routes } from 'react-router-dom'
import { ToastContainer } from 'react-toastify'
import { ThemeProvider } from 'styled-components'

import bo from '../../themes/bo'

import i18n from '../../../i18n'

import '@testing-library/jest-dom'

setLogger({
     log: () => console.log,
     warn: () => console.warn,
     error: () => {
        // do nothing
     }
})
const queryClient = new QueryClient({
    defaultOptions: {
        queries: {
            retryDelay: 1,
            retry: 0
        }
    }
})

const AllTheProviders = ({ children, route, path }: { children?: ReactNode; route: 
string; path: string }) => {
    return (
       <I18nextProvider i18n={i18n}>
            <QueryClientProvider client={queryClient}>
                <MemoryRouter initialEntries={[route]}>
                    <ThemeProvider theme={bo}>
                        <ToastContainer />
                        <Routes>
                            <Route path={path} element={() => children} />
                        </Routes>
                    </ThemeProvider>
                </MemoryRouter>
            </QueryClientProvider>
        </I18nextProvider>
    )
}

const customRender = (ui: ReactElement, { route = '/', path = '/' }: { route?: 
string; path?: string } = {}) =>
    render(ui, { wrapper: (props) => <AllTheProviders {...props} route={route} path={path} /> })

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

测试示例

await expect(screen.findByTestId('Test#Element')).resolves.toHaveTextContent('test')
expect(screen.queryByTestId('Test#Element')).not.toBeInTheDocument()

问题原因及修复方案

核心问题出在AllTheProviders组件的Route配置上:

<Route path={path} element={() => children} />

React Router V6要求Route的element属性接收React元素,而不是返回元素的函数。当前写法会导致组件无法正确渲染,自然找不到测试目标。

修复方式:直接将children作为element的值传递,无需包裹成函数:

<Route path={path} element={<>{children}</>} />

如果children本身是单个元素,也可以直接写:

<Route path={path} element={children} />

另外要确认customRender传递的route和path是否匹配,确保路由能命中对应的Route规则,保证组件正常渲染。修改后重新运行测试即可解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:30:21