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

testandocódigoassíncrono

éComumEm JavaScript ExecutarCódigode FormaAssínclona。Quandovocêroiver0códigoqueéecoptodofobaassíncrona,jest precisa saber Quandoocódigoqueestátestando for scaliandododo,que possa passar para outro teste。jest temváriasmaneiras de lidar com isso。

回调

opadrãosssíncronomais comumsão是“回调”。

por presseo,digamos quevocêtem umafunçãofetchdata(回调)que busca alguns dados e chama回调(数据)QuandoEstá完成。vocêdeseja testar que este dado重返者seja apenas一个字符串'花生酱'

PORPadrão,Testes de Jest Completam Uma Vez Que Eles Chegam Ao FIM da SuaExecução。ISSO意义Que Este Testenão.伊拉·努力赛Como O Esperado:

//nãofaçaisso!
测试 'oDadoéManteigade Amendoim' => {
功能 打回来 数据 {
预计 数据 成为 'Manteiga de Amendoim' ' ;
}
fetchdata. 打回来 ;
} ;

o问题éque o testeseráscommídologo quefetchdata.完成,蚂蚁de sharmer chamar a“回调”。

“uma forma alternativa de测试que corrige isto。Em Vez de Colocar o Teste Em UmaFumçãoComUm Argumento Vazio,使用UMúnicoArgumento Chamado完毕。jestaguardaráAtéque a“回调”完毕éChamadaAntes de Terminar O Teste。

测试 'oDadoéManteigade Amendoim' 完毕 => {
功能 打回来 数据 {
尝试 {
预计 数据 成为 'Manteiga de Amendoim' ;
完毕 ;
} 抓住 错误 {
完毕 错误 ;
}
}
fetchdata. 打回来 ;
} ;

SE.完毕()南那为Chamado,O TesteIráfalhar(Com Erro de Timeout),QueéoQuevocêQueAconteça。

seinstrução.预计Falhar,elelançaumerroe完毕()NãoéChamado。se queremos ver没有log de testes por que法隼,封装的预张预计em bloco.尝试e passar o erro no bloco抓住Para O.完毕。否则,我们最终结束了不透明的超时错误,不显示收到的值期待(数据)

承诺

Se SeuCódigo美国“承诺”,欧ProMessas,HáUmaManeira Mais Simples Para Lidar Com TestesAsslíncronos。Reyorne Uma承诺做SEU Teste,E o Jest Vai esperar essa承诺Ser Resolvida。SE REJETADA的PROMESTA,O TESTEIATOMETALAMETEMERÁFALHAR。

por presseo,digamos quefetchdata.,AOInvésde Usar Uma“回调”,Retorna Uma PromessaQueéESPeradaSerResolvida Na String'花生酱'。Podemos Fazer UM Teste Com:

测试 '数据是花生酱' => {
返回 fetchdata. 然后 数据 => {
预计 数据 成为 '花生酱' ;
} ;
} ;

一定要返回承诺 - 如果你省略这个返回声明,您的测试将在返回的承诺之前完成fetchdata.解析,然后()有机会执行回调。

如果您希望承诺被拒绝,请使用。抓住方法。SE认证de adicionar期待Para Verificar Que UM CertoNúmerodeFirmaçõesSãoChamadas。否则,实现的承诺不会失败。

测试 'fetch失败了错误' => {
预计 断言 1 ;
返回 fetchdata. 抓住 E. => 预计 E. 匹配 '错误' ;
} ;

.resolves./。重点

VocêTambémPodeUSAR O“匹配”.resolves.Em SuaSecondaçãoEsperada,E JestIráGuardar是ProMessa Resolver。SE REJETADA的PROMESTA,O TESTEIATOMETALAMETEMERÁFALHAR。

测试 '数据是花生酱' => {
返回 预计 fetchdata. 解决 成为 '花生酱' ;
} ;

务必返回断言 - 如果您省略此问题返回声明,您的测试将在返回的承诺之前完成fetchdata.已解决,然后()有机会执行回调。

如果您希望承诺被拒绝,请使用。重点匹配者。Ele Funciona Analmicamente Para O“匹配”.resolves.。SE aproMessaécumprida,O teste自动名称伊拉胡士哈尔。

测试 'fetch失败了错误' => {
返回 预计 fetchdata. 拒绝 匹配 '错误' ;
} ;

异步/等待

Como Alternativa,VocêPodeUSAR异步E.等待em seus睾丸。Para Escrever Um TesteAssíncrono,Basta Usar A Palavra Chave异步na frente dafunçãopassada para测试。por presseo,o mesmocenáriodefetchdata.pode ser testado com:

测试 '数据是花生酱' 异步 => {
const 数据 = 等待 fetchdata. ;
预计 数据 成为 '花生酱' ;
} ;
测试 'fetch失败了错误' 异步 => {
预计 断言 1 ;
尝试 {
等待 fetchdata. ;
} 抓住 E. {
预计 E. 匹配 '错误' ;
}
} ;

你可以结合起来异步等待.resolves.或者。重点

测试 '数据是花生酱' 异步 => {
等待 预计 fetchdata. 解决 成为 '花生酱' ;
} ;
测试 'fetch失败了错误' 异步 => {
等待 预计 fetchdata. 拒绝 匹配 '错误' ;
} ;

在这些情况下,异步等待作为承诺示例使用,有效地为与逻辑相同的逻辑。

这些表单中没有一个特别优于其他形式,并且您可以在CodeBase中混合并匹配它们,甚至可以在单个文件中匹配。它只是取决于您觉得哪种风格使您的测试更简单。