跳到主要内容
版本:26.x.

测试React Apps.

在Facebook上,我们使用Jest进行测试反应应用程序。

设置使用创建React应用程序设置创建React App.。它已准备好使用和船上的船舶!!您只需要添加反应测试渲染器用于渲染快照。

跑步

添加 --dev反应测试渲染器

设置无需创建React应用程序使用Babel.

跑步

添加 --dev jest babel-jest @ babel / preset-eng @ babel / precet-rest-test-renseter

你的package.json.应该看起来像这样(哪里<当前版本>是包的实际最新版本号)。请添加脚本和Jest配置条目:

// package.json.
“依赖性” {
“反应” “<当前版本>”
“反应 - DOM” “<当前版本>”
}
“devdependencies” {
“Babel / Preset-Env” “<当前版本>”
“Babel / Prepet-React” “<当前版本>”
“babel-jest” “<当前版本>”
“笑话” “<当前版本>”
“反应 - 测试渲染器” “<当前版本>”
}
“脚本” {
“测试” “笑话”
}
// babel.config.js.
模块 出口 = {
预设 [ 'Babel / Preset-Env' '@ babel / preset-cract' ]
} ;

你很高兴!

快照测试快照测试对于呈现超链接的链接组件:

// link.reacect.js.
进口 反应 “反应” ;
const 地位 = {
徘徊 '徘徊'
普通的 '普通的'
} ;
出口 默认 班级 关联 延伸 反应 成分 {
构造函数 道具 {
极好的 道具 ;
_onmouseEnter. = _onmouseEnter. 捆绑 ;
_onmouseleave. = _onmouseleave. 捆绑 ;
状态 = {
班级 地位 普通的
} ;
}
_onmouseEnter. {
setstate. { 班级 地位 徘徊 } ;
}
_onmouseleave. {
setstate. { 班级 地位 普通的 } ;
}
使成为 {
返回
< 一种
班级名称 = { 状态 班级 }
HREF. = { 道具 || '#' }
onmouseEnter. = { _onmouseEnter. }
onmouseleave. = { _onmouseleave. }
>
{ 道具 孩子们 }
一种 >
;
}
}

现在让我们使用React的测试渲染器和Jest的快照功能与组件交互并捕获渲染的输出并创建快照文件:

// link.reacect.test.js.
进口 反应 “反应” ;
进口 渲染器 '反应测试渲染器' ;
进口 关联 '../link.react' ;
测试 '链接在悬停时更改类' => {
const 成分 = 渲染器 创造
< 关联 = http://www.facebook.com. > Facebook 关联 >
;
= 成分 托杰森 ;
预计 tomatchsnapshot. ;
//手动触发回调
道具 onmouseEnter. ;
//重新渲染
= 成分 托杰森 ;
预计 tomatchsnapshot. ;
//手动触发回调
道具 onmouseleave. ;
//重新渲染
= 成分 托杰森 ;
预计 tomatchsnapshot. ;
} ;

当你运行时纱线测试或者笑话,这将生成如下所示的输出文件:

// __tests __ / __快照__ / link.rehect.test.js.snap
出口 [ ` 链接在悬停1时更改类 ` ] = `
classname =“正常”
href =“http://www.facebook.com”
onmouseenter = {[函数]}
onmouseleave = {[function]}>
Facebook
` ;
出口 [ ` 链接在悬停2时更改类 ` ] = `
classname =“徘徊”
href =“http://www.facebook.com”
onmouseenter = {[函数]}
onmouseleave = {[function]}>
Facebook
` ;
出口 [ ` 链接在悬停3时更改类 ` ] = `
classname =“正常”
href =“http://www.facebook.com”
onmouseenter = {[函数]}
onmouseleave = {[function]}>
Facebook
` ;

下次运行测试时,将与先前创建的快照进行比较。快照应与代码更改一起提交。当快照测试失败时,您需要检查它是否是预期或意外的更改。如果预期更改,您可以调用Jestjest -u.覆盖现有快照。

此示例的代码可用示例/快照

用模拟,酶和反应16的快照测试
笑话 嘲笑 '../somedirectory/somecomponent' => 'SomeComponent' ;

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

警告: < 单一的组分/ > 使用大写HTML。始终使用小写HTML标记 反应。
# 或者:
警告:标签 < 单一组分 > 是无法识别的 这个浏览器。如果您的意思是渲染反应组件,请使用大写字母开始其名称。

由于如何检查元素类型,因此反应16触发这些警告,并且模拟模块失败了这些检查。您的选择是:

  1. 呈现为文本。这样你就不会看到道具传递给快照中的模拟组件,但它很简单:
    笑话 嘲笑 './somecomponent' => => 'SomeComponent' ;
  2. 呈现为自定义元素。任何内容都没有检查DOM“自定义元素”,不应该发射警告。它们是小写的,名称中有短划线。
    笑话 嘲笑 './widget' => => < 模拟小部件 /> ;
  3. 反应测试渲染器。测试渲染器不关心元素类型,并令人愉快地接受例如。单一组分。您可以使用测试渲染器检查快照,并使用酶单独检查组件行为。
  4. 禁用全部警告(应在您的Jest Setup文件中完成):
    笑话 嘲笑 'fbjs / lib /警告' => 要求 'fbjs / lib / liftfunction' ;
    这通常不应该是您选择的选择,因为有用的警告可能会丢失。然而,在某些情况下,例如,当测试反应本地的组件时,我们将反应天然标签渲染到DOM中,并且许多警告是无关紧要的。另一种选择是将Console.warn Swizzle Swizle并抑制特定的警告。

DOM测试反应测试 - 库,或反应的睾丸。以下两种实例使用反应测试库和酶。

反应测试 - 库
// checkboxwithlabel.js.
进口 反应 “反应” ;
出口 默认 班级 checkboxwithlabel. 延伸 反应 成分 {
构造函数 道具 {
极好的 道具 ;
状态 = { ischecked. 错误的 } ;
//手动绑定,因为反应类组件不会自动绑定
// https://reacontjs.oryabo入口g/blog/2015/01/27/reacont-v0.13.0-beta-1.html#autobinding.
onchange. = onchange. 捆绑 ;
}
onchange. {
setstate. { ischecked. !! 状态 ischecked. } ;
}
使成为 {
返回
< 标签 >
< 输入
类型 = 复选框
检查一下 = { 状态 ischecked. }
onchange. = { onchange. }
/>
{ 状态 ischecked. 道具 Labelon. 道具 Labeoff. }
标签 >
;
}
}

// __tests __ / checkboxwithlabel-test.js
进口 反应 “反应” ;
进口 { 清理 Firelevent. 使成为 } '@测试 - 库/反应' ;
进口 checkboxwithlabel. '../checkboxwithlabel' ;
//注意:在@测试库/ React @ 9.0.0或更高版本中自动为您自动完成清理后续
//卸载测试完成后卸载和清除DOM。
after 清理 ;
“checkboxwithlabel单击”后面更改文本 => {
const { QueryBylabeltext. GetBylabeltext. } = 使成为
< checkboxwithlabel. Labelon. = Labeoff. = 离开 />
;
预计 QueryBylabeltext. / 离开 / 一世 Tobeththy. ;
Firelevent. 点击 GetBylabeltext. / 离开 / 一世 ;
预计 QueryBylabeltext. / / 一世 Tobeththy. ;
} ;

此示例的代码可用例子/反应测试 - 库

浅渲染器在这个例子中。

// __tests __ / checkboxwithlabel-test.js
进口 反应 “反应” ;
进口 { } '酶' ;
进口 checkboxwithlabel. '../checkboxwithlabel' ;
测试 “checkboxwithlabel单击”后面更改文本 => {
//渲染文档中标签的复选框
const 复选框 = < checkboxwithlabel. Labelon. = Labeoff. = 离开 /> ;
预计 复选框 文本 toequal. '离开' ;
复选框 '输入' 模拟 '改变' ;
预计 复选框 文本 toequal. '上' ;
} ;

此示例的代码可用实施例/酶

自定义变形金刚
//自定义 - 变换器.JS
'使用strict' ;
const { 转换 } = 要求 '@ babel / core' ;
const jestpreset. = 要求 'babel-preset-jest' ;
模块 出口 = {
过程 SRC. 文件名 {
const 结果 = 转换 SRC. {
文件名
预设 [ jestpreset. ]
} ;
返回 结果 || SRC. ;
}
} ;

别忘了安装@ Babel / CoreBABEL-PREMET-JEST这个例子的包装是工作的。

要使此工作与Jest进行Jest,您需要使用此功能更新您的Jest配置:“变换”:{“\\。js $”:“path / to / custom-transformer.js”}

如果您想使用Babel支持构建变压器,您也可以使用Babel-Jest.要在自定义配置选项中撰写一个并传递:

const Babeljest. = 要求 'babel-jest' ;
模块 出口 = Babeljest. createTranfer {
预设 [ '我的定制预设' ]
} ;