Перейти к основной части
版本:27.0

Тестированиеп反应риложений

В Facebook мы используем Jest для тестирования<一个href="https://reactjs.org/" target="_blank" rel="noopener noreferrer">反应приложений。

Настройка<一个class="hash-link" href="#настройка" title="#">#

Настройка с创建React应用<一个class="hash-link" href="#настройка-с-create-react-app" title="#">#

Есливытолькознакомитесьс反应,мырекомендуемиспользовать<一个href="https://create-react-app.dev/" target="_blank" rel="noopener noreferrer">创建应用程序反应.Он готов к использованию и<一个href="https://create-react-app.dev/docs/running-tests/" target="_blank" rel="noopener noreferrer">поставляется вместе с笑话!Вам понадобится только добавитьreact-test-rendererдлярендерингаснимков。

Запуск

添加 - - - dev react-test-renderer

Настройка без创建React应用<一个class="hash-link" href="#настройка-без-create-react-app" title="#">#

Еслиувасестьсуществующееприложени,етовампонадобитсяустановитьнесколькопакетов,чтобывсехорошоработаловсовместности。Мыиспользуемпакетbabel-jestи巴别塔прежде для反应,чтобыпреобразоватькодвнутриокружениядлятестирования。Такжесм。<一个href="//www.ieatrice.com/ru/docs/27.0/getting-started">использование巴别塔.

Запуск

添加 ——dev jest babel-jest @babel/preset-env @babel/preset-react react-test-renderer

Вашpackage.jsonдолжен выглядеть примерно так (где<当前版本>этофактическийномерпоследнейверсиизависимости)。Пожалуйста,добавьтескриптыиконфигурационныезаписидля开玩笑:

“依赖”
“反应” “<当前版本>”
“react-dom” “<当前版本>”
“devDependencies”
“@babel / preset-env” “<当前版本>”
“@babel / preset-react” “<当前版本>”
“babel-jest” “<当前版本>”
“开玩笑” “<当前版本>”
“react-test-renderer” “<当前版本>”
“脚本”
“测试” “开玩笑”
/ / babel.config.js
模块 出口
预设 “@babel / preset-env” “@babel / preset-react”

Ивсеготово!

Тестирование при помощи снимков<一个class="hash-link" href="#тестирование-при-помощи-снимков" title="#">#

Создадим<一个href="//www.ieatrice.com/ru/docs/27.0/snapshot-testing">тестиспользующийснимокдлякомпонента链接,которыйотображаетгиперссылки:

/ / Link.react.js
进口 反应 useState “反应”
常量 状态
徘徊 “徘徊”
正常的 “正常”
常量 链接 页面 孩子们 =>
常量 状态 setStatus useState 状态 正常的
常量 onMouseEnter =>
setStatus 状态 徘徊
常量 onMouseLeave =>
setStatus 状态 正常的
返回
< 一个
类名称 状态
href 页面 || “#”
onMouseEnter onMouseEnter
onMouseLeave onMouseLeave
>
孩子们
一个 >
出口 默认的 链接

Примечание:Данныепримерыиспользуютфункциональныекомпоненты,ноклассовыекомпонентымогуттестироватьсятакимжепутем。<一个href="https://reactjs.org/docs/components-and-props.html" target="_blank" rel="noopener noreferrer">React:函数和类组件.提醒对于Class组件,我们希望Jest用于测试道具而不是直接测试方法。

Теперьиспользуемрендерертестов反应ифункциисозданияснимковJestдлявзаимодействияскомпонентомизахватарезультатаегоотображения,атакжесозданияфайласнимка:

/ / Link.react.test.js
进口 反应 “反应”
进口 渲染器 “react-test-renderer”
进口 链接 “. . / Link.react”
测试 “当鼠标悬停时,链接改变了类” =>
常量 组件 渲染器 创建
< 链接 页面 http://www.facebook.com > 脸谱网 链接 >
组件 toJSON
预计 toMatchSnapshot
//手动触发回调
道具 onMouseEnter
/ /重新呈现
组件 toJSON
预计 toMatchSnapshot
//手动触发回调
道具 onMouseLeave
/ /重新呈现
组件 toJSON
预计 toMatchSnapshot

当您运行纱线测试开玩笑,这将产生如下输出文件:

/ / __tests__ / __snapshots__ / Link.react.test.js.snap
出口 当鼠标悬停1时,链接更改类
<一个
className = "正常"
href = " http://www.facebook.com "
onMouseEnter ={[功能]}
onMouseLeave ={[功能]}>
脸谱网
< / >
出口 当鼠标悬停2时,链接更改类
<一个
className =“徘徊”
href = " http://www.facebook.com "
onMouseEnter ={[功能]}
onMouseLeave ={[功能]}>
脸谱网
< / >
出口 当鼠标悬停3时,链接更改类
<一个
className = "正常"
href = " http://www.facebook.com "
onMouseEnter ={[功能]}
onMouseLeave ={[功能]}>
脸谱网
< / >

Приследующемзапускетестов,отображаемыйвыводбудетсравненссохраненнымснимком。Этотснимокследуетзанестивсистемуконтроляверсийнарядусизменениямивкоде。Когдатестиспользующийснимкипроваливается,вамследуетпроверитьпредвиденныеэтоизмененияилинет。Еслиизмененияпредвиденны,етовыможетезапуститьJestкомандойjest - uдля перезаписи существующих снимков。

Код данного примера доступен в<一个href="https://github.com/facebook/jest/tree/main/examples/snapshot" target="_blank" rel="noopener noreferrer">例子/快照.

Тестированиеснимковспомощью模拟,酶и反应16<一个class="hash-link" href="#тестирование-снимков-с-помощью-mocks-enzyme-и-react-16" title="#">#

当使用酶和React 16+时,快照测试有一个警告。如果你使用以下样式模拟一个模块:

开玩笑 模拟 “. . / SomeDirectory / SomeComponent” => “SomeComponent”

然后你会在控制台中看到警告:

警告: < SomeComponent / > 是使用大写HTML。总是使用小写的HTML标签 反应。
#或:
警告:标签 < SomeComponent > 无法识别 这个浏览器。如果要呈现React组件,请以大写字母开头。

React 16会根据它检查元素类型的方式触发这些警告,mock模块会失败这些检查。你的选择是:

  1. 呈现为文本。这样你就不会在快照中看到传递给mock组件的道具,但它很简单:/SomeComponent', () => () => 'SomeComponent');
    开玩笑 模拟 ”。/ SomeComponent ' => => “SomeComponent”
  2. 呈现为自定义元素。DOM“自定义元素”不进行任何检查,也不应该发出警告。它们是小写的,名字中有一个破折号。
    tsx
    开玩笑 模拟 ”。/部件 & # 062; & # 062; < mock-widget />
  3. 使用react-test-renderer.测试呈现程序并不关心元素类型,它会很高兴地接受例如。SomeComponent.您可以使用测试渲染器检查快照,并使用酶分别检查组件行为。
  4. 全部禁用警告(应该在你的jest安装文件中完成):
    开玩笑 模拟 “fbjs / lib /警告” => 需要 “fbjs / lib / emptyFunction”
    同时禁用所有警告(应该在你的jest安装文件中完成):mock('fbjs/lib/warning', () => require('fbjs/lib/emptyFunction'));这通常不应该是您的选择,因为有用的警告可能会丢失。然而,在某些情况下,例如在测试react-native的组件时,我们将react-native标记呈现到DOM中,许多警告是不相关的。另一种选择是混合控制台。警告和抑制特定的警告。

ТестированиеDOM<一个class="hash-link" href="#тестирование-dom" title="#">#

Есливыхотитесоздаватьутвержденияиманипулироватьотображаемымикомпонентами,выможетеиспользовать<一个href="https://github.com/kentcdodds/react-testing-library" target="_blank" rel="noopener noreferrer">react-testing-library,<一个href="http://airbnb.io/enzyme/" target="_blank" rel="noopener noreferrer">酶,или的反应<一个href="https://reactjs.org/docs/test-utils.html" target="_blank" rel="noopener noreferrer">TestUtils.Следующиедвапримераиспользуютreact-testing-libraryи酶。

react-testing-library<一个class="hash-link" href="#react-testing-library" title="#">#

ВыдолжнызапуститьYarn add——dev @test -library/react, чтобы использовать反应测试库。

Давайтеимплементируемчекбок,скоторыйпереключаетсямеждудвумялейблами:

/ / CheckboxWithLabel.js
进口 反应 useState “反应”
常量 CheckboxWithLabel labelOn labelOff =>
常量 完成 setIsChecked useState
常量 onChange =>
setIsChecked ! 完成
返回
< 标签 >
< 输入 类型 复选框 检查 完成 onChange onChange />
完成 labelOn labelOff
标签 >
出口 默认的 CheckboxWithLabel
/ / __tests__ / CheckboxWithLabel-test.js
进口 反应 “反应”
进口 清理 fireEvent 渲染 “@testing-library /反应”
进口 CheckboxWithLabel “. . / CheckboxWithLabel”
//注意:在@testing-library/react@9.0.0或更高版本中,每次运行后都会自动为你完成清理
//在测试结束后卸载和清理DOM
afterEach 清理
'CheckboxWithLabel在点击后改变文本' =>
常量 queryByLabelText getByLabelText 渲染
< CheckboxWithLabel labelOn labelOff />
预计 queryByLabelText / / toBeTruthy
fireEvent 点击 getByLabelText / /
预计 queryByLabelText / / toBeTruthy

这个例子的代码可以在<一个href="https://github.com/facebook/jest/tree/main/examples/react-testing-library" target="_blank" rel="noopener noreferrer">例子/ react-testing-library.

酶<一个class="hash-link" href="#enzyme" title="#">#

Вамнадозапустить纱线添加-dev酶дляиспользования酶。Есливыиспользуетеверсию反应ниже15.5.0,товытакжедолжныустановитьreact-addons-test-utils

Давайтеперепишемтестсверху,используя酶вместоreact-testing-library。В этом примере мы используем в<一个href="http://airbnb.io/enzyme/docs/api/shallow.html" target="_blank" rel="noopener noreferrer">浅渲染器включенныйв酶。

/ / __tests__ / CheckboxWithLabel-test.js
进口 反应 “反应”
进口 “酶”
进口 CheckboxWithLabel “. . / CheckboxWithLabel”
测试 'CheckboxWithLabel在点击后改变文本' =>
//在文档中呈现带标签的复选框
常量 复选框 < CheckboxWithLabel labelOn labelOff />
预计 复选框 文本 toEqual “关闭”
复选框 找到 “输入” 模拟 “改变”
预计 复选框 文本 toEqual “上”

这个例子的代码可以在<一个href="https://github.com/facebook/jest/tree/main/examples/enzyme" target="_blank" rel="noopener noreferrer">例子/酶.

Пользовательскиетрансформаторы<一个class="hash-link" href="#пользовательские-трансформаторы" title="#">#

Есливамнуженболеепродвинутыйфункционал,вытакжеможетесоздатьсвойсобственныйтрансформатор。Вместоиспользованияbabel-jestздесь приведен пример использования@babel /核心

/ / custom-transformer.js
使用严格的
常量 变换 需要 “@babel /核心”
常量 jestPreset 需要 “babel-preset-jest”
模块 出口
过程 src 文件名
常量 结果 变换 src
文件名
预设 jestPreset
返回 结果 || src

Не забудьте установить пакетыbabel-coreиbabel-preset-jest网址:чтобы данный пример сработал。

Дляиспользованияс开玩笑,вамнужнобудетдобавитьследующийкодввашуJestконфигурацию:“转换”:{“美元\ \ . js”:“路径/ / custom-transformer.js”}

Есливыхотитепостроитьтрансформаторсподдержкой巴贝尔вытакжеможетеиспользоватьbabel-jestдлясозданияипередачипользовательскихнастроек:

常量 babelJest 需要 “babel-jest”
模块 出口 babelJest createTransformer
预设 “my-custom-preset”

Смотрите<一个href="//www.ieatrice.com/ru/docs/27.0/code-transformation">дополнительныематериалыдля получения более подробной информации。