关于:
嘿,目前我正在尝试用 jest 和我的 react 组件的 react 测试库编写测试。我也使用 react 路由器。
问题:
我想检查当路径更改而不与单个组件交互时应用程序是否路由到正确的组件。
例如,如果当前路径名是“/impressum”,我想从 Impressum 页面获取快照。
我不知道如何将路径传递到 <App>
这样只显示一条路线。
我要测试的组件:
import React from 'react'
import { BrowserRouter as Router, Switch, Route } from "react-router-dom"
import WeatherPage from "../WeatherPage/WeatherPage.js"
import AddWeatherPage from "../AddWeatherPage/AddWeatherPage.js"
import WeatherDetailsPage from "../WeatherDetailsPage/WeatherDetailsPage.js"
import DeleteWeatherPage from '../DeleteWeatherPage/DeleteWeatherPage.js'
import ImpressumPage from '../ImpressumPage/ImpressumPage.js'
class App extends React.Component {
render() {
return (
<Router>
<Switch>
<Route path="/weatherDetails" component={WeatherDetailsPage} />
<Route path="/addWeather" component={AddWeatherPage} />
<Route path="/deleteWeather" component={DeleteWeatherPage} />
<Route path="/impressum" component={ImpressumPage} />
<Route path="/" component={WeatherPage} />
</Switch>
</Router>
);
}
}
export default App
我尝试了什么:
<App>
<MemoryRouter>
的组件从 -> 导入 { MemoryRouter } from 'react-router';并推送路线:https://reacttraining.com/react-router/web/guides/testing <App>
<Router>
的组件从 -> 导入 { 路由器 } 从“react-router-dom”;并推送历史对象。 我的基本测试代码
下面你可以看到我用于测试的代码,我在测试时做了一些更改,但这个基本部分一直保留。
describe("snapshot-test", () => {
it("renders component", () => {
const { asFragment } = render(
<App></App>
)
expect(asFragment()).toMatchSnapshot()
})
})
最佳答案
我刚刚找到了解决方案。
我不得不将路由器模拟为一个 div 并包含它的子代码。
这通过以下方式工作:
您需要文件夹 __mocks__/react-router-dom.js
其中包含以下代码:
import React from 'react';
const reactRouterDom = require("react-router-dom")
reactRouterDom.BrowserRouter = ({children}) => <div>{children}</div>
module.exports = reactRouterDom
现在您可以使用
MemoryRouter
定义Route
的路径应该指向。应用程序.test.js:
import React from "react";
import { render } from "@testing-library/react";
import { MemoryRouter } from 'react-router-dom';
import App from './App';
describe("unit-test", () => {
it("renders the right component with following path '/impressum'", () => {
const { getByTestId } = render(
<MemoryRouter initialEntries={['/impressum']}>
<App></App>
</MemoryRouter>
)
let impressumPage = getByTestId("impressum-page")
expect(impressumPage).toBeInTheDocument()
})
})
另请访问以下链接,我从那里得到了解决方案。
https://medium.com/@antonybudianto/react-router-testing-with-jest-and-enzyme-17294fefd303
关于javascript - 如何测试带有 <Router> 标签的组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61913963/