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

测试异步代码

在JavaScript中,代码异步运行是很常见的。当您有异步运行的代码时,Jest需要知道它所测试的代码何时完成,然后才能进行另一个测试。Jest有几种方法来处理这个问题。

回调#

最常见的异步模式是回调。

例如,假设有afetchData(回调)函数,获取一些数据并调用回调(数据)当它完成时。您想要测试返回的数据是否是字符串“花生酱”

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

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

问题是测试会尽快完成fetchData在调用回调之前完成。

还有另一种形式测试修复了这个问题。不要将测试放在一个带空参数的函数中,而是使用一个被调用的参数完成。笑话要等到完成在完成测试之前调用callback。

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

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

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

承诺#

如果您的代码使用promise,则有一种更直接的方法来处理异步测试。从测试中返回一个承诺,Jest将等待这个承诺解决。如果承诺被拒绝,测试将自动失败。

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

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

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

如果你期望一个承诺被拒绝,使用.catch方法。确保添加expect.assertions来验证调用了一定数量的断言。否则,一个兑现的承诺就不会在测试中失败。

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

.resolves/.rejects#

你也可以用.resolves在expect语句中使用matcher,而Jest将等待该承诺解决。如果承诺被拒绝,测试将自动失败。

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

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

如果你期望一个承诺被拒绝,使用.rejects匹配器。它类似于.resolves匹配器。如果承诺实现了,测试将自动失败。

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

异步/等待#

或者,您可以使用异步等待在你的测试。要编写一个异步测试,请使用异步传递给的函数前面的关键字测试。例如,相同的fetchData场景可以通过以下方式测试:

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

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

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

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

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

最后一次更新在通过Wei-An日元