关键在于正确等待异步操作完成后再断言:需将测试函数声明为async,用await获取结果后断言;错误场景用expect(fn()).rejects.tothrow();依赖须mock为promise;注意超时设置与资源清理。

在单元测试中对 async/await 函数做断言,关键在于正确处理 Promise 的生命周期,确保测试框架等待异步操作完成后再执行断言。不同测试环境(如 Jest、Vitest、Mocha)略有差异,但核心逻辑一致。
使用 async test 函数包裹测试用例
测试函数本身必须是 async,这样你才能在内部用 await 等待被测异步函数返回结果,再进行断言:
- Jest / Vitest:直接把
test或it的回调声明为async - 不要用
.then()+done()(旧式 Mocha 风格),容易出错且冗余
✅ 正确写法(Jest 示例):
test('fetches user data successfully', async () => {
const result = await fetchUser(123);
expect(result.name).toBe('Alice');
expect(result.id).toBe(123);
});
断言 Promise 被拒绝(错误场景)
测试异步函数抛出错误时,不能直接 await fn(),否则会中断测试。应使用 expect(fn()).rejects(Jest/Vitest)或 await expect(fn()).rejects.toThrow(...) 等语法:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
expect(fn()).rejects.toEqual(...):匹配拒绝值(如自定义 error 对象) -
expect(fn()).rejects.toThrow('message'):匹配错误消息(推荐用于 Error 实例) - 避免
try/catch+expect(error),除非需要精细控制断言逻辑
✅ 示例:
test('throws when user not found', async () => {
await expect(fetchUser(999)).rejects.toThrow('User not found');
});
模拟异步依赖(如 API 调用)
真实请求会拖慢测试、不可靠且难断言。需用 mock 替换异步行为:
- Jest:用
jest.mock('./api')+mockResolvedValue或mockRejectedValue - Vitest:用
vi.mock+mockResolvedValue - 确保 mock 返回的是 Promise,否则
await会报错或行为异常
✅ 示例(Jest):
jest.mock('./api', () => ({
getUser: jest.fn().mockResolvedValue({ id: 1, name: 'Bob' })
}));
test('uses mocked API to return user', async () => {
const user = await fetchUser(1);
expect(user.name).toBe('Bob');
expect(api.getUser).toHaveBeenCalledWith(1);
});
注意超时与清理(可选但重要)
异步测试默认有超时(Jest 是 5s),长时间挂起的 Promise 会导致测试失败。必要时可显式设置:
- Jest:
test('...', async () => { ... }, 10000)(单位毫秒) - 如果测试中启动了定时器、事件监听或后台任务,记得在
afterEach中清理,防止影响后续测试 - Vitest 中还可使用
vi.useFakeTimers()控制时间流
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










