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

Testando应用程序的反应是原生的

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

Obtenha uma visão mais profunda em como testar um app React Native de exemplo lendo a seguinte série:<一个href="https://callstack.com/blog/testing-react-native-with-the-new-jest-part-1-snapshots-come-into-play/" target="_blank" rel="noopener noreferrer">part1: Jest -快照进入jogo (eminglês)e<一个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">part2: Jest -快照还原para suas动作减少器(eminglês)

Instalacao<一个类="hash-link" href="#instalação" title="#">#

A partir da versão 0.38 de react-native, uma instalação Jest é incluída por padrão, ao executarreact-native init。deve ser automaticamente adicionada ao seu arquivo package.json:

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

附注:você estiver atualizando seu application -native - e preorimente usou a predefiniçãojest-react-native,移除dependência de seu arquivopackage.jsone修改predefinição段react-native他们一旦disso。

运行纱线测试用Jest运行测试。

证人快照<一个类="hash-link" href="#teste-snapshot" title="#">#

我们criar嗯<一个href="//www.ieatrice.com/pt-BR/docs/snapshot-testing">证人快照para um pequeno componente "intro" com alguns "views" e componentde texto e alguns estilos:

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

Agora vamos usar o renderer de teste do React e o recurso de快照do Jest para interagir com o组件捕获saída renderizada e criar um arquivo de快照:

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

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

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

网址próxima vez que você executar os testes,一个saída renderizada será比较快照criado preorimente。快照应该与代码更改一起提交。快照的Quando um testate de snapshot falhar, você precisa inspecionar se é uma mudança predida ou não有意。请登录mudança é esperada, você pode invocar Jest comjest - u对取代快照存在。

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

Configuracao predefinida<一个类="hash-link" href="#configuração-predefinida" title="#">#

一个predefinição配置的环境é muito opinativa e baseada不允许在útil没有Facebook的情况下使用。您可以访问opções de configuração您可以访问substituídas您可以访问我的个人访问predefinição é usada。

消费品展<一个类="hash-link" href="#ambiente" title="#">#

react-nativevem com uma pré-definição Jest, então o campojest.preset德建package.json产品开发apontar帕拉react-native。一个predefinição é um ambiente节点的ambiente de um app的反应是本地的。Porque ele não carrega nenhum DOM ou APIs de navegador, melhora deravelmente o tempo de inicialização开玩笑。

personalizacao de transformIgnorePatterns<一个类="hash-link" href="#personalização-de-transformignorepatterns" title="#">#

的<一个href="//www.ieatrice.com/pt-BR/docs/configuration.html">transformIgnorePatterns选项可以用来指定哪些文件应该被Babel转换。谢谢módulos npm de react-native infelizmente não pre-compilam seu código fonte antes de public。

Por padrão a predefinição jest-react-native só processa os arquivos fonte do projeto e react-native。如果你有需要转换的npm依赖项,你可以通过包括react-native之外的模块来自定义这个配置选项:

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

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

Se você gostaria de fornecer configuração形容词para cada arquivo de teste, a<一个href="//www.ieatrice.com/pt-BR/docs/configuration.html">opcao de configuracaosetupFiles请指定instalação上的操作系统脚本。

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

O<一个href="//www.ieatrice.com/pt-BR/docs/configuration.html">moduleNameMapper请您帮我看一下您的表格módulo帮我看一下módulo。Por padrão a predefinição mapeia todas as imagens para um módulo de esboço de imagem, mas se um módulo não pode ser encontrado esta opção de configuração pode ajudar:

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

Dicas<一个类="hash-link" href="#dicas" title="#">#

Simule (mock, em inglês) módulos nativos usando jest.mock<一个类="hash-link" href="#simule-mock-em-inglês-módulos-nativos-usando-jestmock" title="#">#

一个predefinição国际做的笑话react-nativevem com algumas simulações (mock, em inglês) padrão que são aplicadas em um repositório react-native。然而,一些react-native组件或第三方组件依赖于本地代码进行渲染。我是你的朋友,你的手册是simulação,你可以开一个类似的玩笑implementação。

举个例子,如código,这取决于vídeo的组成部分react-native-videoconvém esboçar ele com um simulação manual como esta:

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

Isto irá renderizar o componente como<视频{…道具}/ >com todas as suas proprietary ades no snapshot de saída。另请参阅<一个href="//www.ieatrice.com/pt-BR/docs/tutorial-react.html">关于酶和反应的注意事项

Às vezes você precisa fornecer uma simulação manual mais complexa。Por exemplo, se você gostaria de transmitir os tipos das proprietary ou campos estáticos de um componente nativo para uma simulação (mock, em inglês), você pode retornar um componente React diferente a partir de uma simulação através deste auxiliar do jest-react-native:

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

您可以访问você gostaria de criar sua própria simulação手册,você pode fazer algo parecido com isto:

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

我知道,você pode querer simular um módulo nativo que não seja um componente React。A mesma técnica pode ser plicada。Nós recommendamos inspecionar o código-fonte do módulo nativo e registrar o módulo ao executar um aplicativo react native em um dispositivo real e então modelar uma simulação manual após o módulo real。

Se você acabar por simular os mesmos módulos repedamente vez após vez é recomendável definir estas simulações em um arquivo separado e adicioná-lo à列表setupFiles