React Testing Library入门

1. 简介

React Testing Library 基于DOM Testing Library的基础上添加一些API,主要用于测试React组件。如果是其它的技术栈,可以选择对应的Testing Library库。该库在使用过程并不关注组件的内部实现,而是更关注测试。该库基于react-dom和react-dom/test-utils,是以上两者的轻量实现。

注:React Testing Library官方文档需翻墙查看。

2. 安装

npm install --save-dev @testing-library/react

注:如果使用Create React App初始化React应用时,会有选项提示是否要使用React Testing Library

3. 基本能力

  • 组件渲染(render)
  • 元素查找(get/query/find)
  • 事件触发(fireEvent)

4. 使用

在编写单元测试过程中,可以按照AAA模式实现。

  • Arrange 编排,使用render渲染组件。
render(component)
  • Act 执行,使用fireEvent去触发用户行为。
fireEvent.click(element)
  • Assert 断言,对期望的结果予以判断。
expect(result).matcher()
//search.js
function Search({ value, onChange, children }) {
  return (
    <div>
      <label htmlFor="search">{children}</label>
      <input
        id="search"
        type="text"
        value={value}
        onChange={onChange}
      />
    </div>
  );
}
//search.test.js
import React from 'react'
//引入@testing-library/react提供的方法
import {render, fireEvent, screen} from '@testing-library/react'
import search from './search'

describe('Search', () => {
  test('calls the onChange callback handler', () => {
    const onChange = jest.fn();
    // Arrange 编排
    render(
      <Search value="" onChange={onChange}>
        Search:
      </Search>
    );
    //Act 执行
    fireEvent.change(screen.getByRole('textbox'), {
      target: { value: 'JavaScript' },
    });
    //Assert 断言
    expect(onChange).toHaveBeenCalledTimes(1);
  });
});

更多例子:fetch

推荐教程:How to use React Testing Library Tutorial

5.常用API

render
render的参数:

render(
    ui: React.ReactElement<any>,
    options?: { //基本不用
        container, //
        baseElement,
        wrapper, //
        queries //用于自定义选择器
    }
)

render的结果:

{
    ...queries, //选择器,例如(get/query/find)By(Text/Label/...)
    container: HTMLDivElement,//自动创建一个div,并插入到body中
    baseElement: HTMLBodyElement, //相当于document.body
    debug: Function, //打印当前document.body
    rerender: Function, //重新渲染组件
    unmount: Function, //组件卸载,此时container.innerHTML === ''
    asFragment:Function //记录某个时刻的dom
}

render的例子:

//列出的是常用的
{queryByText, container, baseElement, debug, rerender, unmount} = render(conponent)

文档:https://testing-library.com/docs/react-testing-library/api#render

cleanup
相当于给组件置成unmount,一般在afterEach()中执行,如果使用的Jest,不需要在afterEach中手动设置,框架已默认每次test结束后执行cleanup。

Queries

search type
(单个元素)
search type
(多个元素)
function
(查询单个元素)
适用场景
getBy getAllBy getByText
getByRole
getByLabelText
getByPlaceholderText
getByAltText
getByDisplayValue
由于只返回元素或error,适用于确定该元素存在的情况
queryBy queryAllBy queryByText
queryByRole
queryByLabelText
queryByPlaceholderText
queryByAltText
queryByDisplayValue
用于元素可能不存在
findBy findAllBy findByText
findByRole
findByLabelText
findByPlaceholderText
findByAltText
findByDisplayValue
用于异步元素

关于具体差别的例子可以看:https://www.robinwieruch.de/react-testing-library

LabelText: getByLabelText: <label for="search" />
PlaceholderText: getByPlaceholderText: <input placeholder="Search" />
AltText: getByAltText: <img alt="profile" />
DisplayValue: getByDisplayValue: <input value="JavaScript" />
TestId: getByTestId: <div data-testid='search'></div>

也可以自定义选择器:https://testing-library.com/docs/react-testing-library/setup#add-custom-queries
详细queries,查阅:https://testing-library.com/docs/react-testing-library/cheatsheet#queries

fireEvent

fireEvent(node, event)

events API

act
对react-dom/test-utils中的act函数进行了一层包装。act的作用是在你进行断言之前,保证所有由组件渲染、用户交互以及数据获取产生的更新全部在dom实现。

act(() => {
  // render components
});
act(() => {
  // fireEvent
});
// make assertions

waitFor
用于异步

waitFor(Promise)

screen

screen的方法继承自queries, queries有的能力都有,此外还增加了debug()的能力.

6.补充

(1) 关于更多自定义的东西,例如render、选择器以及与Jest有的配置,查阅官方文档吧,写得也是很清楚哦!

(2)对于dom的一些断言,可以添加testing-library库提供的jest-dom/extend-expect来更好得对dom进行断言。

//引入
import '@testing-library/jest-dom/extend-expect'

匹配器概览:

//Custom matchers
toBeDisabled
toBeEnabled
toBeEmptyDOMElement
toBeInTheDocument
toBeInvalid
toBeRequired
toBeValid
toBeVisible
toContainElement
toContainHTML
toHaveAccessibleDescription
toHaveAccessibleName
toHaveAttribute
toHaveClass
toHaveFocus
toHaveFormValues
toHaveStyle
toHaveTextContent
toHaveValue
toHaveDisplayValue
toBeChecked
toBePartiallyChecked
toHaveErrorMessage
//Deprecated matchers
toBeEmpty
toBeInTheDOM
toHaveDescription

具体用法,可以查阅文档


好啦,关于React testing Library的东西基本都涵盖了,至于更深层的东西,就去查阅源码吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • 纯Typescript测试相关配置 1: 安装jest相关的依赖 jest -- 我们的test runner,...
    NANAISNANA阅读 3,300评论 1 1
  • 本章涵盖 设置测试 React 应用程序的环境不同 React 测试工具的概述为 React 应用程序编写第一个测...
    启辰阅读 454评论 0 0
  • 概述 Testing-library[https://testing-library.com/] 是 React ...
    anOnion阅读 5,319评论 0 6
  • 什么是测试用例 字面理解来说,就是测试一个东西,对于我们前端开发来说就是测试前端功能,前端主要分为 html cs...
    clmll阅读 1,881评论 0 0
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,030评论 0 4