jest测试异步函数推荐用async/await:测试resolve时直接await调用并断言结果;测试reject时用await expect(...).rejects.tothrow();需mock异步依赖如fetch,用mockresolvedvalue/mockrejectedvalue;可设超时时间并清理副作用。

在 Jest 中测试返回 Promise 的异步函数,核心是让测试函数等待 Promise 完成,并验证其结果或异常。Jest 原生支持 async/await 和 Promise.then() 两种方式,推荐使用 async/await,更简洁、可读性更强。
用 async/await 测试 resolve 的 Promise
直接在测试函数前加 async,内部用 await 调用被测函数,然后用 expect 断言返回值:
test('fetchUser 返回用户对象', async () => {
const user = await fetchUser(123);
expect(user).toEqual({ id: 123, name: 'Alice' });
});
注意:Jest 会自动等待返回 Promise 的测试函数完成,无需手动调用 done() 或 return Promise(但显式 return 也有效)。
测试 reject 的 Promise(抛出错误)
用 await expect(...).rejects.toThrow() 检查 Promise 是否被拒绝,且错误符合预期:
test('fetchUser 抛出错误时返回 404', async () => {
await expect(fetchUser(999)).rejects.toThrow('Not Found');
// 或更精确地匹配错误实例
await expect(fetchUser(999)).rejects.toThrowError(/Not Found/);
});
不推荐用 try/catch + expect().toThrow(),因为那会断言同步错误,无法捕获 Promise rejection。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
模拟异步依赖(如 API 调用)
用 jest.mock() 或 jest.fn().mockResolvedValue() / mockRejectedValue() 控制行为:
// 假设 fetchUser 内部调用 fetch
jest.mock('node-fetch');
test('fetchUser 正确处理 mock 成功响应', async () => {
require('node-fetch').mockResolvedValue({
json: jest.fn().mockResolvedValue({ id: 456, name: 'Bob' })
});
const result = await fetchUser(456);
expect(result).toEqual({ id: 456, name: 'Bob' });
});
关键点:
- 确保 mock 在
test内或beforeEach中设置,避免跨测试污染 -
mockResolvedValue返回一个立即 resolve 的 Promise;mockRejectedValue同理 - 若 mock 对象有链式方法(如
json()),需逐层 mock 返回值
超时与清理(可选但实用)
Jest 默认超时 5 秒。若测试可能较慢,可在 test 第三个参数中调整:
test('长时间操作测试', async () => {
const data = await slowAsyncTask();
expect(data).toBeTruthy();
}, 10000); // 10 秒超时
如有副作用(如启动定时器、监听事件),建议在 afterEach 中清理,防止内存泄漏或干扰后续测试。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










