如何测试 React 路由 ?

简介: 本文承接上文 如何测试 React 异步组件?,这次我将继续使用 @testing-library/react 来测试我们的 React 应用,并简要简要说明如何测试路由系统。

「这是我参与2022首次更文挑战的第 2 天,活动详情查看:2022首次更文挑战」。

前言

本文承接上文 如何测试 React 异步组件?,这次我将继续使用 @testing-library/react 来测试我们的 React 应用,并简要简要说明如何测试路由系统。

基本示例

以下代码使用 react-router V6版本, V5 使用 Switch 包裹组件

通常我们的程序会写下如下代码:

首先我们有 2 个页面

  • src/routes/home.jsx 主页
export default function Home() {
    return (
      <main style={
  { padding: "1rem 0" }}>
        <h2>这是主页</h2>
      </main>
    );
  }
  • src/routes/about.jsx 关于页面
    export default function Home() {
    return (
      <main style={
        { padding: "1rem 0" }}>
        <h2>这是关于页</h2>
      </main>
    );
    }
    

然后使用 HashRouter 或者 BrowserRouter 包裹,形成我们的程序的主入口index.jsx

  • src/index.jsx 程序入口
    ```jsx
    import { HashRouter, Routes, Route, Link } from "react-router-dom";
    import Home from "./routes/home";
    import About from "./routes/about";

const NoMatch = () =>

No Found
;

function App() {
return (


主页
关于


} />
} />
} />


);
}

export default App;


因为我们的页面足够简单,所以页面不会报错,那如果当页面变量的复杂,页面下的其中一个组件报错,就会引起白屏

例如 现在在 `about` 页面下添加一个错误组件

```jsx
import React from "react";

function AboutContent() {
  throw new Error("抛出一个测试错误");
}

export default function About() {
  return (
    <main style={
  { padding: "1rem 0" }}>
      <h2>这是关于页</h2>
      <AboutContent />
    </main>
  );
}

此时页面就会报错,但如果我们没有点击 about 页面,我们的程序任然正常运行,所以我们需要对路由进行测试。

测试方法

我们知道 @testing-library/react 是运行在 node 环境中的,但浏览器中并没有 HashRouter 或者 BrowserRouter ,所以我们需要一个用到 MemoryRouter

此时我们需要将原先的 index.jsx 拆分到 app.jsx

  • src/index.jsx 入口
    ```jsx
    import React from "react";
    import ReactDOM from "react-dom";
    import App from "./App";
    import { HashRouter } from "react-router-dom";

ReactDOM.render(




,
document.getElementById("root")
);

-   `src/app.jsx` 
```jsx
import { HashRouter, Routes, Route, Link } from "react-router-dom";
import Home from "./routes/home";
import About from "./routes/about";

const NoMatch = () => <div>No Found</div>;

function App() {
  return (
    <HashRouter>
      <div>
        <Link to="/">主页</Link>
        <Link to="/about">关于</Link>
      </div>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="*" element={<NoMatch />} />
      </Routes>
    </HashRouter>
  );
}

export default App;

此时我们可以添加单元测试

import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { createMemoryHistory } from "history";
import React from "react";
import { Router } from "react-router-dom";
import App from "./App";

test("测试整个路由系统", () => {
  render(
    <MemoryRouter>
      <App />
    </MemoryRouter>
  );
  expect(screen.getByText(/这是主页/i)).toBeInTheDocument();

  userEvent.click(screen.getByText(/关于/i));
  expect(screen.getByText(/这是关于页/i)).toBeInTheDocument();
});

MemoryRouter 有2个参数

  • 第一个参数 initialEntries={["/users/mjackson"]} 配置初始化路由
  • 第二个参数 initialIndex 默认是 initialEntries 中的最后一个值

测试 404 页面

test('测试路由未匹配', () => {
  render(
    <MemoryRouter initialEntries={['/some/bad/route']}>
      <App />
    </MemoryRouter>,
  )

  expect(screen.getByText(/Not Found/i)).toBeInTheDocument()
})

通用测试

当页面有多个的时候,我们可以添加一个通用组件来确保每个页面都没有错误

import { useLocation } from "react-router-dom";

export const LocationDisplay = ({ children }) => {
  const location = useLocation();

  return (
    <>
      <div data-testid="location-display">{location.pathname}</div>
      {children}
    </>
  );
};

将 url 显示在页面上, 通过遍历确保每个页面可以正确渲染。

let routes = ["/", "/about"];

routes.forEach((route) => {
  test(`确保${route} 的 url 可以正确显示`, () => {
    render(
      <MemoryRouter initialEntries={[route]}>
        <LocationDisplay>
          <App />
        </LocationDisplay>
      </MemoryRouter>
    );

    expect(screen.getByText(new RegExp(route))).toBeInTheDocument();
  });
});

小结

以下是路由测试的步骤:

  1. 将程序和使用什么路由分开;
  2. 使用 MemoryRouter 来测试;
  3. 点击确保页面可以正确渲染;
  4. 提供一个公共包裹组件,通过遍历来测试每个页面,确保渲染

以上就是本文的全部内容,那么如何测试 react hooks ?请关注我,我会尽快出 React test 系列的下文。

希望这篇文章对大家有所帮助,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端。

相关文章
|
2月前
|
前端开发 API UED
React 路由守卫 Guarded Routes
【10月更文挑战第26天】本文介绍了 React 中的路由守卫(Guarded Routes),使用 `react-router-dom` 实现权限验证、登录验证和数据预加载等场景。通过创建 `AuthContext` 管理认证状态,实现 `PrivateRoute` 组件进行路由保护,并在 `App.js` 中使用。文章还讨论了常见问题和易错点,提供了处理异步操作的示例,帮助开发者提升应用的安全性和用户体验。
79 1
|
2月前
|
前端开发 安全 网络安全
React——路由Route
React——路由Route
43 2
React——路由Route
|
2月前
|
监控 JavaScript 前端开发
如何在实际应用中测试和比较React和Vue的性能?
总之,通过多种方法的综合运用,可以相对客观地比较 React 和 Vue 在实际应用中的性能表现,为项目的选择和优化提供有力的依据。
51 1
|
3月前
|
资源调度 前端开发 测试技术
React Router 路由管理
【10月更文挑战第10天】本文介绍了 React Router,一个在 React 应用中管理路由的强大工具。内容涵盖基本概念、安装与使用方法、常见问题及解决方案,如路由嵌套、动态路由和路由守卫等,并提供代码示例。通过学习本文,开发者可以更高效地使用 React Router,提升应用的导航体验和安全性。
418 19
|
2月前
|
前端开发 JavaScript 安全
学习如何为 React 组件编写测试:
学习如何为 React 组件编写测试:
47 2
|
2月前
|
前端开发 JavaScript 测试技术
React 模拟测试与 Jest
【10月更文挑战第21天】本文介绍了如何使用 Jest 进行 React 组件的单元测试和模拟测试,涵盖了基础概念、常见问题及解决方案,并提供了实践案例。通过学习本文,你将掌握如何有效地使用 Jest 提高代码质量和稳定性。
103 1
|
3月前
|
前端开发 网络架构
React 路由
10月更文挑战第11天
50 2
|
3月前
|
前端开发 JavaScript 网络架构
实现动态路由与状态管理的SPA——使用React Router与Redux
【10月更文挑战第1天】实现动态路由与状态管理的SPA——使用React Router与Redux
67 1
|
2月前
|
资源调度 前端开发 JavaScript
React 测试库 React Testing Library
【10月更文挑战第22天】本文介绍了 React Testing Library 的基本概念和使用方法,包括安装、基本用法、常见问题及解决方法。通过代码案例详细解释了如何测试 React 组件,帮助开发者提高应用质量和稳定性。
98 0
|
3月前
|
前端开发 JavaScript 应用服务中间件
linux安装nginx和前端部署vue项目(实际测试react项目也可以)
本文是一篇详细的教程,介绍了如何在Linux系统上安装和配置nginx,以及如何将打包好的前端项目(如Vue或React)上传和部署到服务器上,包括了常见的错误处理方法。
1117 0
linux安装nginx和前端部署vue项目(实际测试react项目也可以)