Jest - React 测试
在本章中,我们将学习如何使用 Jest 测试 React 组件。Jest 是一个功能强大的测试工具,可让您轻松为 JavaScript 应用程序编写测试。我们将重点关注 React 测试的三个关键领域:
Jest - React 组件测试
在 Jest 中,测试 React 组件涉及渲染它们并检查它们是否显示正确的输出。这通常是使用 React 测试库和 Jest 来完成的。
安装所需的库
在开始之前,请确保已安装 Jest 和 React 测试库:
npm install --save @testing-library/react @testing-library/jest-dom
测试 React 组件
假设我们有一个 Greeting 组件,它接受 name prop 并显示问候语。
// Greeting.js import React from 'react'; const Greeting = ({ name }) => { return <h1>Hello, {name}!</h1>; }; export default Greeting;
为了测试此组件,我们渲染它并检查它是否正确显示问候消息。
// Greeting.test.js import { render, screen } from '@testing-library/react'; // 导入测试方法 import Greeting from './Greeting'; // 导入组件 test('显示正确的问候消息', () => { render(<Greeting name="John" />); // 使用"John"作为 prop 渲染组件 // 检查是否显示问候语 expect(screen.getByText(/hello, john!/i)).toBeInTheDocument(); });
Jest - 快照测试
Jest 中的快照测试有助于验证您的组件不会意外更改。它捕获组件的渲染输出并保存。在未来的测试中,Jest 会将当前输出与保存的快照进行比较。如果有任何差异,Jest 会提醒您。
快照测试
以下是我们如何使用 Jest 为我们的 Greeting 组件创建快照测试。
// Greeting.test.js import { render } from '@testing-library/react'; import Greeting from './Greeting'; test('匹配快照', () => { const { asFragment } = render(<Greeting name="John" />); // 将渲染的输出与快照进行比较 expect(asFragment()).toMatchSnapshot(); });
Jest 在第一次运行时创建快照并将其与未来的输出进行比较。如果输出发生变化,Jest 会提醒您,以便您确认更改是否是故意的。
Jest - 测试 React Hooks
React hooks 管理组件中的状态、副作用和其他逻辑。测试这些 hooks 可确保它们按预期工作。使用 Jest,您可以测试自定义(用户定义)和内置钩子,如 useState 和 useEffect。
测试自定义钩子
React 中的自定义钩子用于处理可重用逻辑。让我们来看看如何测试一个管理布尔状态的简单自定义钩子。
- 步骤 1 - 创建 useToggle 钩子: useToggle 钩子切换布尔状态(真/假)。以下是实现:
// useToggle.js import { useState } from 'react'; const useToggle = () => { const [state, setState] = useState(false); const toggle = () => setState(!state); return { state, toggle }; }; export default useToggle;
// useToggle.test.js 从 '@testing-library/react-hooks' 导入 { renderHook, act }; 从 './useToggle' 导入 useToggle; test('应该在 true 和 false 之间切换状态', () => { const { result } = renderHook(() => useToggle()); // 检查初始状态是否为 false expect(result.current.state).toBe(false); // 调用切换函数来更改状态 act(() => result.current.toggle()); // 检查状态是否更改为 true expect(result.current.state).toBe(true); });
使用副作用测试 useEffect
React 的 useEffect 钩子用于更新 DOM 或获取数据等副作用。在这里,我们将向您展示如何测试使用 useEffect 处理此类副作用的组件。
- 步骤 1 - 创建计数组件:在这里,我们创建一个 Counter 组件,该组件使用 useState 将初始计数设置为 0,并包含一个按钮以将其增加 1。
// Counter.js import React, { useState } from 'react'; const Counter = () => { const [count, setCount] = useState(0); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increase</button> </div> ); }; export default Counter;
// Counter.test.js import { render, screen, fireEvent } from '@testing-library/react'; import Counter from './Counter'; test('单击按钮时计数器递增', () => { // 渲染计数器组件 render(<Counter />); // 获取按钮和段落元素 const button = screen.getByText(/increase/i); const passage = screen.getByText(/count: 0/i); // 模拟单击按钮 fireEvent.click(button); // 检查计数是否已增加 expect(paragraph).toHaveTextContent('Count: 1'); });
此测试验证单击按钮时计数是否从 0 增加到 1。