乐闻世界logo
搜索文章和话题

如何让 Jest 等待所有异步代码完成执行后再 expect

4 个月前提问
3 个月前修改
浏览次数35

1个答案

1

在使用Jest进行异步代码的单元测试时,确保所有的异步操作都完成后再进行expect断言是非常重要的。这可以通过几种方法实现:

1. 使用done回调

Jest提供了一个done回调参数,可以用于测试函数。当你在异步测试中调用了done()函数,Jest就会知道你的异步操作已经完成,接下来可以安全地执行断言。

示例代码:

javascript
test('异步测试示例 with done', done => { setTimeout(() => { expect(true).toBe(true); done(); }, 1000); });

在这个例子中,我们在setTimeout的回调函数中调用了done()来告诉Jest异步代码执行完毕。

2. 返回Promise

如果你的函数返回一个Promise,Jest会等待这个Promise解决(resolve)后再继续执行测试。这在处理Promise-based的异步代码时非常方便。

示例代码:

javascript
function fetchData() { return new Promise(resolve => resolve("data")); } test('异步测试示例 with Promise', () => { return fetchData().then(data => { expect(data).toBe("data"); }); });

在这个例子中,fetchData返回一个解决为"data"的Promise,Jest会等待这个Promise解决后再执行断言。

3. 使用Async/Await

async/await是处理异步JavaScript代码的一种现代且清晰的方式。在你的测试函数前加上async关键字,并在调用返回Promise的函数时使用await

示例代码:

javascript
async function fetchData() { return "data"; } test('异步测试示例 with async/await', async () => { const data = await fetchData(); expect(data).toBe("data"); });

在这个例子中,通过await fetchData(),Jest会等待fetchData的Promise解决,并将解决的值赋给data,然后执行断言。

总结

选择哪种方法取决于你的具体需求和你的代码风格。如果你的异步逻辑使用了callback,可能done方法是一个好选择;如果你的代码库广泛使用Promiseasync/await,那么后两种方法可能更适合你。使用这些方法可以确保在执行断言之前,所有的异步代码都已经正确完成。

2024年6月29日 12:07 回复

你的答案