跳转到主要内容
版本:26.倍

测试反应本地程序

在Facebook,我们使用玩笑测试<一个href="https://reactnative.dev/" target="_blank" rel="noopener noreferrer">反应应用。

阅读以下系列文章来深入了解如何使用玩笑测试一个真实的反应本地示例应用:<一个href="https://callstack.com/blog/testing-react-native-with-the-new-jest-part-1-snapshots-come-into-play/" target="_blank" rel="noopener noreferrer">第一篇:Jest -快照发挥作用和<一个href="https://callstack.com/blog/testing-react-native-with-the-new-jest-part-2-redux-snapshots-for-your-actions-and-reducers/" target="_blank" rel="noopener noreferrer">第二篇:Jest -为您的行动和还原剂回来的快照

安装<一个类="hash-link" href="#安装" title="#">#

从react-native版本0.38开始,在运行时默认包含Jest设置react-native init。下面的配置应该自动添加到您的包中。json文件:下面的配置应该自动添加到您的包中。json文件:

{
“脚本” : {
“测试” : “开玩笑”
} ,
“开玩笑” : {
“预设” : “react-native”
}
}

注意:如果您正在升级您的react-native应用程序,并且之前使用过jest-react-native预设,从您的package.json将预设值更改为react-native代替。

纱线测试来运行Jest测试。

快照测试<一个类="hash-link" href="#snapshot-test" title="#">#

下面来为一个入门的小型组件创建一个<一个href="//www.ieatrice.com/zh-Hans/docs/snapshot-testing">快照测试,它的内部有些看来,文本组件和一些样式:

/ / Intro.js
进口 反应 , { 组件 } “反应” ;
进口 { 样式表 , 文本 , 视图 } “react-native” ;
介绍 扩展 组件 {
渲染 ( ) {
返回 (
< 视图 风格 = { 风格 容器 } >
< 文本 风格 = { 风格 欢迎 } > 欢迎 反应 本地的 ! 文本 >
< 文本 风格 = { 风格 指令 } >
一个 反应 本地的 快照测试
文本 >
视图 >
) ;
}
}
常量 风格 = 样式表 创建 ( {
容器 : {
alignItems : “中心” ,
写成backgroundColor : “# F5FCFF” ,
flex : 1 ,
justifyContent : “中心” ,
} ,
指令 : {
颜色 : # 333333的 ,
marginBottom : 5 ,
textAlign : “中心” ,
} ,
欢迎 : {
字形大小 : 20. ,
保证金 : 10 ,
textAlign : “中心” ,
} ,
} ) ;
出口 默认的 介绍 ;
文本 >
视图 >
) ;
}
}
常量 风格 = 样式表 创建 ( {
容器 : {
alignItems : “中心” ,
写成backgroundColor : “# F5FCFF” ,
flex : 1 ,
justifyContent : “中心” ,
} ,
指令 : {
颜色 : # 333333的 ,
marginBottom : 5 ,
textAlign : “中心” ,
} ,
欢迎 : {
字形大小 : 20. ,
保证金 : 10 ,
textAlign : “中心” ,
} ,
} ) ;
出口 默认的 介绍 ;

现在,使用的测试渲染器和笑话的反应快照特性来和组件交互,获得渲染结果和生成快照文件:

/ / __tests__ / Intro-test.js
进口 反应 “反应” ;
进口 渲染器 “react-test-renderer” ;
进口 介绍 “. . /介绍” ;
测试 ( 显示正确的 , ( ) = > {
常量 = 渲染器 创建 ( < 介绍 /> ) toJSON ( ) ;
预计 ( ) toMatchSnapshot ( ) ;
} ) ;

当你运行npm测试或者开玩笑,将产生一个像下面的文件:

/ / __tests__ / __snapshots__ / Intro-test.js.snap
出口 ( 介绍正确渲染1 ] =
<视图
风格= {
对象{
“alignItems”:“中心”,
“写成backgroundColor”:“# F5FCFF”,
“弯曲”:1、
“justifyContent”:“中心”,
}
} >
<文本
风格= {
对象{
“字形大小”:20,
“保证金”:10
“textAlign”:“中心”,
}
} >
欢迎来到React Native!
< /文本>
<文本
风格= {
对象{
“颜色”:“333333 #”,
“marginBottom”:5
“textAlign”:“中心”,
}
} >
这是一个React原生快照测试。
< /文本>
< /视图>
;
< / 文本 >
< 文本
风格 = {
对象 {
“颜色” : “333333 #” ,
“marginBottom” : 5 ,
“textAlign” : “中心” ,
}
} >
是一个 反应 本地的 快照测试
< / 文本 >
< / 视图 >
;

下次你运行测试时,渲染的结果将会和之前创建的快照进行比较。快照应该与代码更改一起提交。当快照测试失败,你需要去检查是否是你想要或不想要的变动。当快照测试失败,你需要去检查是否是你想要或不想要的变动。如果变动符合预期,你可以通过jest - u调用笑话从而重写存在的快照。

示例代码可在<一个href="https://github.com/facebook/jest/tree/master/examples/react-native" target="_blank" rel="noopener noreferrer">例子/酶找到。

预设配置<一个类="hash-link" href="#preset-configuration" title="#">#

预设设置了环境,非常武断,基于我们在Facebook上发现的有用的东西。所有的配置选项都可以被覆盖,就像在没有使用预设时可以自定义一样。所有的配置选项都可以被覆盖,就像在没有使用预设时可以自定义一样。

环境<一个类="hash-link" href="#environment" title="#">#

react-native带着玩笑预设的飞船,所以jest.preset你的领域package.json应该指出,react-native。预置是一个节点环境,模拟React原生应用的环境。因为它不加载任何DOM或浏览器api,它大大提高了Jest的启动时间。预置是一个节点环境,模拟React原生应用的环境。因为它不加载任何DOM或浏览器api,它大大提高了Jest的启动时间。

transformIgnorePatterns定制<一个类="hash-link" href="#transformignorepatterns-customization" title="#">#

的<一个href="//www.ieatrice.com/zh-Hans/docs/configuration.html">transformIgnorePatterns选项可以用来指定哪些文件应该被Babel转换。不幸的是,许多react-native npm模块在发布之前并不预编译它们的源代码。不幸的是,许多react-native npm模块在发布之前并不预编译它们的源代码。

默认情况下,jest-react-native预设只处理项目自己的源文件和react-native。默认情况下,jest-react-native预设只处理项目自己的源文件和react-native。如果你有需要转换的npm依赖项,你可以通过包括react-native之外的模块来自定义这个配置选项:

{
“transformIgnorePatterns” : (
“node_modules / (? ! (react-native |我的项目| react-native-button) /)”
]
}

setupFiles<一个类="hash-link" href="#setupfiles" title="#">#

如果您想为每个测试文件提供额外的配置,则<一个href="//www.ieatrice.com/zh-Hans/docs/configuration.html">setupFiles配置选项可以用来指定安装脚本。

moduleNameMapper<一个类="hash-link" href="#modulenamemapper" title="#">#

可以使用<一个href="//www.ieatrice.com/zh-Hans/docs/configuration.html">modulenamemapper将模块路径映射到其他模块。默认情况下,预设将所有图像映射到一个图像存根模块,但如果找不到某个模块,这个配置选项会有帮助:亚搏取款

{
“moduleNameMapper” : {
“my-module.js” : “< rootDir > /路径/ / my-module.js”
}
}

提示<一个类="hash-link" href="#tips" title="#">#

使用jest.mock模拟本机模块<一个类="hash-link" href="#mock-native-modules-using-jestmock" title="#">#

内置的Jest预设react-native附带了一些应用于react-native存储库的默认模拟。然而,一些react-native组件或第三方组件依赖于本地代码进行渲染。在这种情况下,Jest的手动模拟系统可以帮助模拟底层实现。亚搏取款然而,一些react-native组件或第三方组件依赖于本地代码进行渲染。在这种情况下,Jest的手动模拟系统可以帮助模拟底层实现。亚搏取款

例如,如果您的代码依赖于第三方的本地视频组件调用react-native-video你可能想要用这样的手动模拟来消除它:

开玩笑 模拟 ( “react-native-video” , ( ) = > “视频” ) ;

这将把组件渲染为<视频{…道具}/ >在快照输出中包含它的所有道具。想了解更多还可以阅读<一个href="//www.ieatrice.com/zh-Hans/docs/tutorial-react.html">关于酶和反应的注意事项。想了解更多还可以阅读<一个href="//www.ieatrice.com/zh-Hans/docs/tutorial-react">关于酶和反应的注意事项

有时您需要提供更复杂的手动模拟。有时您需要提供更复杂的手动模拟。例如,如果你想把原生组件的道具类型或静态字段转发给mock,你可以通过jest-react-native中的这个helper从mock中返回一个不同的React组件:亚搏取款

开玩笑 模拟 ( “路径/ / MyNativeComponent” , ( ) = > {
常量 mockComponent = 需要 ( “react-native /嘲笑/ mockComponent” ) ;
返回 mockComponent ( “路径/ / MyNativeComponent” ) ;
} ) ;

或者,如果你想创建自己的手动模拟,你可以这样做:

开玩笑 模拟 ( “文本” , ( ) = > {
常量 RealComponent = 开玩笑 requireActual ( “文本” ) ;
常量 反应 = 需要 ( “反应” ) ;
文本 扩展 反应 组件 {
渲染 ( ) {
返回 反应 createElement ( “文本” , 道具 , 道具 孩子们 ) ;
}
}
文本 proptype = RealComponent proptype ;
返回 文本 ;
} ) ;

在其他情况下,你可能想要模拟一个不是React组件的本机模块。同样的技巧也可以应用。我们建议检查本机模块的源代码,并在真实设备上运行react本机应用时记录该模块,然后在真实模块之后手动建模。同样的技巧也可以应用。我们建议检查本机模块的源代码,并在真实设备上运行react本机应用时记录该模块,然后在真实模块之后手动建模。

如果反复模拟相同的模块,建议在单独的文件中定义这些模拟并将其添加到列表中setupFiles