应使用 expect(...).rejects 断言 promise 拒绝或 async 函数抛错,它自动等待并防止未处理 rejection;避免 tothrow() 直接作用于 async 函数、手动 try/catch 或遗漏 await。

在 JavaScript 异步单元测试中,正确验证 Promise 拒绝(reject)和 async 函数抛出的错误,关键在于让测试框架明确知道你正在等待一个失败行为,并防止未处理的 rejection 报错干扰测试结果。
用 expect(...).rejects 断言 Promise 拒绝
这是 Jest 中最直接、推荐的方式。它自动等待 Promise 完成,并在拒绝时提取 reason 做断言,内部已处理 rejection 防止警告。
- 写法简洁,语义清晰,无需手动
catch或try/catch - 支持链式断言,比如
.rejects.toThrow('xxx')或.rejects.toEqual(expectedError) - 若 Promise 成功 resolve,测试会自动失败
示例:
test('fetchUser rejects when API fails', async () => {
jest.mock('./api', () => ({
getUser: jest.fn(() => Promise.reject(new Error('Network error')))
}));
await expect(getUser(123)).rejects.toThrow('Network error');
});
对 async 函数抛错,同样用 .rejects 即可
async 函数返回的本身就是 Promise,所以不需要额外包装或特殊处理——只要函数内部 throw,就等价于返回一个 rejected Promise。
- 不要写
expect(async () => { ... }).toThrow():这断言的是函数本身(同步)是否抛错,而async函数总是同步返回 Promise,永远不会同步抛错 - 也不要手动
try/catch后用expect(error).toBeInstanceOf(...):冗余且容易漏掉未捕获 rejection
正确写法:
test('processData throws on invalid input', async () => {
await expect(processData(null)).rejects.toThrow('Invalid input');
});
需要检查错误细节时,用 .rejects + 匹配器组合
除了 toThrow,还可以用 toEqual、toMatchObject、instanceOf 等精确比对错误对象。
-
.rejects.toEqual(new Error('msg')):要求错误实例完全相等(注意:Error 对象不满足===,一般不用toEqual比较整个 Error 实例) -
.rejects.toMatchObject({ message: '...', code: 'NOT_FOUND' }):适合自定义错误类 -
.rejects.toBeInstanceOf(ValidationError):验证错误类型
示例(自定义错误):
class ValidationError extends Error {
constructor(message, code) {
super(message);
this.code = code;
}
}
test('validate rejects with ValidationError', async () => {
await expect(validate('')).rejects.toMatchObject({
message: 'Value cannot be empty',
code: 'EMPTY_VALUE'
});
});
避免常见陷阱
以下做法看似可行,但存在隐患:
-
return promise.catch(e => expect(e).toBe...):没返回 catch 后的 Promise,Jest 可能提前结束测试;且未处理 resolve 分支,逻辑不完整 -
await promise; expect(true).toBe(false):Promise 拒绝会导致测试直接报 unhandledRejection,中断执行 - 忘记
await或return:测试函数退出过早,拒绝未被捕获,触发全局 warning
核心原则:让测试函数返回或 await 一个被正确断言的 Promise,由 Jest 统一管理生命周期。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











