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

测试异步代码

它在JavaScript中是常见的代码以异步运行。当您有异步运行的代码时,jest需要知道在测试的代码完成后,它可以在它可以继续到另一个测试之前。jest有几种方法可以处理这个。

回调

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

例如,让我们说你有一个fetchdata(回调)获取某些数据和调用的函数回调(数据)完成后。您希望测试此返回的数据是字符串'花生酱'

默认情况下,Jest测试完成后完成其执行结束。这意味着这个测试将会不是按预期工作:

//不要这样做!
测试 '数据是花生酱' => {
功能 打回来 数据 {
预计 数据 成为 '花生酱' ;
}
fetchdata. 打回来 ;
} ;

问题是测试将尽快完成fetchdata.完成,然后才能拨打回调。

有一种替代形式测试解决这个问题。而不是使用空参数将测试放在函数中,而是使用一个名为的单个参数完毕。jest将等到完毕在完成测试之前调用回调。

测试 '数据是花生酱' 完毕 => {
功能 打回来 数据 {
尝试 {
预计 数据 成为 '花生酱' ;
完毕 ;
} 抓住 错误 {
完毕 错误 ;
}
}
fetchdata. 打回来 ;
} ;

如果完毕()从未调用过,测试将失败(随超时错误),这就是您要发生的事情。

如果是预计语句失败,它会抛出错误和完毕()不被称为。如果我们想在测试记录中看到它为什么失败,我们必须包裹预计在一个尝试阻止并通过错误抓住块到完毕。否则,我们最终结束了不透明的超时错误,不显示收到的值期待(数据)

承诺

如果您的代码使用承诺,则可以在处理异步测试中有更直接的方式。从您的测试中返回承诺,jest将等待该承诺来解决。如果拒绝承诺,则测试将自动失败。

例如,让我们这么说fetchdata.,而不是使用回调,返回应该解析到字符串的承诺'花生酱'。我们可以用:

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

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

如果您希望承诺被拒绝,请使用。抓住方法。确保添加期待验证调用某个数量的断言。否则,实现的承诺不会失败。

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

.resolves./。重点

你也可以使用.resolves.匹配在您的期望陈述中,jest将等待该承诺来解决。如果拒绝承诺,则测试将自动失败。

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

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

如果您希望承诺被拒绝,请使用。重点匹配者。它类似于.resolves.匹配者。如果履行承诺,则测试将自动失败。

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

异步/等待

或者,您可以使用异步等待在你的测试中。要编写异步测试,请使用异步函数前面的关键字传递给测试。例如,相同fetchdata.可以使用以下情况进行场景:

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

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

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

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

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

上次更新了经过格雷格