目录
拍摄快照
现在,让我们测试 DOM 元素和事件
这只是在 React 中进行测试的一种方法
首页 web前端 css教程 React测试库入门

React测试库入门

Apr 21, 2025 am 09:45 AM

Getting Started with React Testing Library

您可能在想:另一个 React 测试库?CSS-Tricks 上已经介绍了这么多(事实上,我已经发布了一个关于 Jest 和 Enzyme 的文章),难道选项还不够多吗?

但是,react-testing-library 不仅仅是另一个测试库。它是一个测试库,是的,但它构建于一个根本原则之上,这使它与其他测试库区别开来。

您的测试越能模拟软件的使用方式,它们就能给您带来越大的信心。

它尝试针对用户如何使用您的应用程序进行测试。事实上,它的实现方式使得即使您重构组件,测试也不会中断。我知道我们在 React 之旅的某个时刻都遇到过这种情况。

我们将一起花一些时间,使用 react-testing-library 为我构建的一个简单的待办事项应用程序编写测试。您可以本地克隆仓库:

git clone https://github.com/kinsomicrote/todoapp-test.git
登录后复制

如果您这样做,接下来安装所需的包:

## yarn
yarn add --dev react-testing-library jest-dom

## npm
npm install --save-dev react-testing-library jest-dom
登录后复制

如果您想知道为什么 Jest 在这里,我们使用它进行断言。在 src 目录内创建一个名为 __test__ 的文件夹,并创建一个名为 App.test.js 的新文件。

拍摄快照

快照测试会记录对已测试组件执行的测试,作为一种直观查看更改之间差异的方式。

当我们第一次运行此测试时,我们会拍摄组件外观的第一个快照。因此,第一次测试一定会通过,因为没有其他快照可以与之比较来表明某些内容失败了。只有当我们通过添加新元素、类、组件或文本对组件进行新的更改时,它才会失败。添加快照创建时或上次更新时不存在的内容。

快照测试将是我们在这里编写的第一个测试。让我们打开 App.test.js 文件并使其如下所示:

import React from 'react';
import { render, cleanup } from "react-testing-library";
import "jest-dom/extend-expect";
import App from './App';

afterEach(cleanup);

it("matches snapshot", () => {
  const { asFragment } = render(<app></app>);
  expect(asFragment()).toMatchSnapshot();
});
登录后复制

这导入了我们用于编写和运行测试的必要包。render 用于显示我们要测试的组件。我们使用 cleanup 在每次测试运行后清除内容——正如您在 afterEach(cleanup) 行中看到的那样。

使用 asFragment,我们获得渲染组件的 DocumentFragment。然后我们期望它与已创建的快照匹配。

让我们运行测试看看会发生什么:

## yarn
yarn test

## npm
npm test
登录后复制

正如我们现在所知,如果这是我们的第一个测试,则会在 __tests__ 目录内名为 __snapshots__ 的新文件夹中创建一个组件快照。我们实际上会在其中获得一个名为 App.test.js.snap 的文件,它看起来像这样:

// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`matches snapshot 1`] = `
<documentfragment><div>
    <div>
      <div>
        <h2>
          Add Todo
        </h2>
      </div>
    </div>

      <div>
        <div>
          </div>
      </div>
      <div>
        <div>

            Add Task

        </div>
      </div>

    <div>
      <div>
        <h3>
          Lists
        </h3>
        <ul data-test="">
<li>
            <div>
              Buy Milk

                X

            </div>
          </li>
          <li>
            <div>
              Write tutorial

                X

            </div>
          </li>
        </ul>
</div>
    </div>
  </div>
</documentfragment>
`;
登录后复制

现在,让我们测试 DOM 元素和事件

我们的应用程序包含两个默认情况下在应用程序第一次运行时显示的待办事项。我们想确保它们确实在第一次应用程序运行时显示,因此,为了测试这一点,我们必须定位无序列表(<ul></ul>)并检查长度。我们期望长度等于 2——项目数。

it('it displays default todo items', () => {
  const { getByTestId } = render(<app></app>);
  const todoList = getByTestId('todos-ul');
  expect(todoList.children.length).toBe(2);  
});
登录后复制

我们在该代码段中使用 getByTestIdApp 组件中提取测试 ID。然后我们设置 todoList 来定位 todos-ul 元素。这应该返回 2。

使用我们到目前为止学到的知识,看看您能否编写一个测试来断言用户可以在输入字段中输入值。以下是您需要执行的操作:

  • 获取输入字段
  • 为输入字段设置值
  • 触发更改事件
  • 断言输入字段的值与您在步骤 2 中为其设置的值相同

不要偷看我下面的答案!花尽可能多的时间。

还在继续吗?太棒了!我去喝杯咖啡,马上回来。

嗯,咖啡。☕️

哦,你完成了!你真棒。让我们比较答案。我的看起来像这样:

it('allows input', () => {
  const { getByTestId, fireEvent } = render(<app></app>);
  let item = 'Learn React';
  const todoInputElement = getByTestId('todo-input');
  todoInputElement.value = item;
  fireEvent.change(todoInputElement);
  expect(todoInputElement.value).toBe('Learn React');
});
登录后复制

使用 getByTestId,我能够提取应用程序中的测试 ID。然后我创建一个变量,将其设置为字符串“Learn React”,并使其成为输入字段的值。接下来,我使用其测试 ID 获取输入字段,并在设置输入字段的值后触发更改事件。完成此操作后,我断言输入字段的值确实是“Learn React”。

这与您的答案一致吗?如果您有其他方法,请留下评论!

接下来,让我们测试我们能否添加新的待办事项。我们将需要获取输入字段、添加新项目的按钮和无序列表,因为这些都是创建新项目所需的所有元素。

我们为输入字段设置一个值,然后触发按钮点击以添加任务。我们可以通过使用 getByText 获取按钮来做到这一点——通过对文本为“Add Task”的 DOM 元素触发点击事件,我们应该能够添加一个新的待办事项。

让我们断言无序列表元素中子元素(列表项)的数量等于 3。这假设默认任务仍然完好无损。

it('adds a new todo item', () => {
  const { getByText, getByTestId, fireEvent } = render(<app></app>);
  const todoInputElement = getByTestId('todo-input');
  const todoList = getByTestId('todos-ul');
  todoInputElement.value = 'Learn React';
  fireEvent.change(todoInputElement);
  fireEvent.click(getByText('Add Task'));
  expect(todoList.children.length).toBe(3); 
});
登录后复制

非常不错,对吧?

这只是在 React 中进行测试的一种方法

您可以在下一个 React 应用程序中尝试 react-testing-library。仓库中的文档非常详尽,并且——与大多数工具一样——是最佳的起点。Kent C. Dodds 构建了它,并且在 Frontend Masters(需要订阅)上有一个关于测试的完整课程,该课程还涵盖了 react-testing-library 的来龙去脉。

也就是说,这只是 React 的一个测试资源。当然还有其他资源,但希望您现在已经看到了一些内容,并且有兴趣尝试一下,当然也要使用最适合您项目的资源。

以上是React测试库入门的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

VUE 3 VUE 3 Apr 02, 2025 pm 06:32 PM

它的出局!恭喜Vue团队完成了完成,我知道这是一项巨大的努力,而且很长时间。所有新文档也是如此。

使用Redwood.js和Fauna构建以太坊应用 使用Redwood.js和Fauna构建以太坊应用 Mar 28, 2025 am 09:18 AM

随着最近比特币价格超过20k美元的攀升,最近打破了3万美元,我认为值得深入研究创建以太坊

您可以从浏览器获得有效的CSS属性值吗? 您可以从浏览器获得有效的CSS属性值吗? Apr 02, 2025 pm 06:17 PM

我有人写了这个非常合法的问题。 Lea只是在博客上介绍了如何从浏览器中获得有效的CSS属性。那样的是这样。

带有粘性定位的堆叠卡和一点点的杂物 带有粘性定位的堆叠卡和一点点的杂物 Apr 03, 2025 am 10:30 AM

前几天,我发现了科里·金尼文(Corey Ginnivan)网站上的这一点,当您滚动时,彼此之间的卡片堆放集。

在CI/CD上有点 在CI/CD上有点 Apr 02, 2025 pm 06:21 PM

我说的“网站”比“移动应用程序”更合适,但我喜欢Max Lynch的框架:

在WordPress块编辑器中使用Markdown和本地化 在WordPress块编辑器中使用Markdown和本地化 Apr 02, 2025 am 04:27 AM

如果我们需要直接在WordPress编辑器中向用户显示文档,那么最佳方法是什么?

比较浏览器的响应式设计 比较浏览器的响应式设计 Apr 02, 2025 pm 06:25 PM

这些桌面应用程序中有许多目标是同时在不同的维度上显示您的网站。因此,例如,您可以写作

为什么Flex布局中的紫色斜线区域会被误认为是'溢出空间”? 为什么Flex布局中的紫色斜线区域会被误认为是'溢出空间”? Apr 05, 2025 pm 05:51 PM

关于Flex布局中紫色斜线区域的疑问在使用Flex布局时,你可能会遇到一些令人困惑的现象,比如在开发者工具(d...

See all articles