javascript - 如何测试带有 <Router> 标签的组件?

标签 javascript reactjs react-router react-testing-library

关于:

嘿,目前我正在尝试用 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

我尝试了什么:
  • 所以我已经尝试实现以下示例:https://testing-library.com/docs/example-react-router
  • 我还尝试包装 <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/

    相关文章:

    javascript - 在 React 中单击按钮时停止计时器

    javascript - 类型错误 : Cannot read property 'url' of undefined for JSONPlaceholder

    javascript - 绘制二维分层 map javascript

    javascript - 如何使用 jQuery 获取传递的 html 元素的 Id?

    javascript - React JS 中不同组件之间如何共享状态?

    javascript - 设计和构建多角色 ReactJS 应用程序

    javascript - 使用 React Router 重新加载页面时出现 404 错误

    javascript - react : how to redirect a match of a list of components to sub-path (/templates =>/templates/list)

    javascript - 如何在 javascript 中使用构造函数返回实例或其他东西?

    javascript - 通过递增计数将键编号分配给对象中的键