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

Testarea codului asincron

Se întâmplă frerecvent în JavaScript să Se execute cod asincron。Atunci când aveţi cod care se execută în mod asincron, Jest trebuie să ştie când codul pe care-l testează s-a complete de execute, înainte de a trece la un test。笑话是我的multe modui pentru a rezolva acest ru。

Callback-uri#

我想要回调电话。

例如,să spunem că aveţi o funcţiefetchData(回调)请注意日期şi apelează回调(数据)la决赛。您想要测试返回的数据是否是字符串“花生酱”

默认情况下,Jest测试在执行结束后就完成了。这意味着这次测试会工作目的:

//不要这样做!
测试 ( “数据是花生酱” , ( ) = > {
函数 回调 ( 数据 ) {
预计 ( 数据 ) 托比 ( “花生酱” ) ;
}
fetchData ( 回调 ) ;
} ) ;

这个问题că是由îndată决定的fetchDataîși termină execuția, înainte de a apela vreodată callback-ul。

Există o formă alternativă de测试关心rezolvă acest lucru。În loc de a pune testul într-o funcţie一个参数gol, utilizaţi一个参数numit完成。开玩笑aştepta până când funcția完成este apelată înainte de terminarea testului。

测试 ( “数据是花生酱” , 完成 = > {
函数 回调 ( 数据 ) {
试一试 {
预计 ( 数据 ) 托比 ( “花生酱” ) ;
完成 ( ) ;
} ( 错误 ) {
完成 ( 错误 ) ;
}
}
fetchData ( 回调 ) ;
} ) ;

如果(完成)则测试将失败(带有超时错误),这正是您希望发生的情况。

如果预计语句失败,将抛出错误和(完成)不叫。如果我们想在测试日志中看到它失败的原因,我们必须进行包装预计在一个试一试阻塞并将错误传递到完成。否则,就会出现一个不透明的超时错误,不显示接收到的值期望(数据)

Promisiuni#

如果您的代码使用promise,则有一种更直接的方法来处理异步测试。从测试中返回一个承诺,Jest将等待这个承诺解决。În cazul în护理承诺网站respinsă, testul va eşua自动。

举个例子fetchData,而不是使用回调函数,它返回一个被假定解析为字符串的promise“花生酱”。我们可以用:

测试 ( “数据是花生酱” , ( ) = > {
返回 fetchData ( ) 然后 ( 数据 = > {
预计 ( 数据 ) 托比 ( “花生酱” ) ;
} ) ;
} ) ;

如果忽略了这一点,请确保返回promise返回语句,您的测试将在promise返回之前完成fetchData然后()有机会执行回调。

如果你期望一个承诺被拒绝,使用.catch方法。Asiguraţ电流-电压ăcă它ț我expect.assertions请核查că un anumit număr de aserțiuni必须执行。否则,一个兑现的承诺就不会在测试中失败。

测试 ( '取回失败,有错误' , ( ) = > {
预计 断言 ( 1 ) ;
返回 fetchData ( ) ( e = > 预计 ( e ) toMatch ( “错误” ) ) ;
} ) ;

.resolves/.rejects#

你也可以用.resolves在expect语句中使用matcher,而Jest将等待该承诺解决。În cazul în护理承诺网站respinsă, testul va eşua自动。

测试 ( “数据是花生酱” , ( ) = > {
返回 预计 ( fetchData ( ) ) 解决了 托比 ( “花生酱” ) ;
} ) ;

如果忽略了这一点,请确保返回断言返回语句,您的测试将在promise返回之前完成fetchData被解析,然后()有机会执行回调。

如果你期望一个承诺被拒绝,使用.rejects匹配器。Funcționează确切的ca validatorul.resolves。În cazul în护理承诺网站îndeplinită, testul va eşua自动。

测试 ( '取回失败,有错误' , ( ) = > {
返回 预计 ( fetchData ( ) ) 拒绝 toMatch ( “错误” ) ;
} ) ;

异步/等待#

Alternativ,单纯的ţ我它异步ş我等待在证人。要编写一个异步测试,请使用异步传递给的函数前面的关键字测试。举例,acelaşi scenario ufetchDatapoate fi test cu:

测试 ( “数据是花生酱” , 异步 ( ) = > {
常量 数据 = 等待 fetchData ( ) ;
预计 ( 数据 ) 托比 ( “花生酱” ) ;
} ) ;
测试 ( '取回失败,有错误' , 异步 ( ) = > {
预计 断言 ( 1 ) ;
试一试 {
等待 fetchData ( ) ;
} ( e ) {
预计 ( e ) toMatch ( “错误” ) ;
}
} ) ;

您可以组合异步等待.resolves.rejects

测试 ( “数据是花生酱” , 异步 ( ) = > {
等待 预计 ( fetchData ( ) ) 解决了 托比 ( “花生酱” ) ;
} ) ;
测试 ( '取回失败,有错误' , 异步 ( ) = > {
等待 预计 ( fetchData ( ) ) 拒绝 toMatch ( “错误” ) ;
} ) ;

在这些情况下,异步等待是promise示例使用的相同逻辑的有效语法糖。

这些表单没有一种特别优于其他表单,您可以跨代码库甚至在单个文件中混合和匹配它们。这取决于您认为哪种风格使您的测试更简单。