javascript异步测试中捕获reject错误需确保测试框架感知promise拒绝,推荐async/await+try/catch或expect().rejects匹配器,避免未处理的rejection警告。

在 JavaScript 异步测试中捕获 reject 错误,关键在于让测试框架能感知到 Promise 的拒绝,并正确处理它——否则未捕获的 rejection 会触发全局 unhandledrejection,导致测试失败或静默忽略。
使用 async/await + try/catch
这是最直观、推荐的方式。把被测异步逻辑包裹在 try/catch 中,显式断言错误类型或消息:
test('fetchData rejects with network error', async () => {
await expect(fetchData('invalid-url')).rejects.toThrow('Network error');
});
// 或手动 try/catch
test('fetchData rejects with custom error', async () => {
try {
await fetchData('bad-id');
throw new Error('Expected rejection');
} catch (err) {
expect(err).toBeInstanceOf(Error);
expect(err.message).toContain('Not found');
}
});
使用 .catch() 链式处理
适用于需要验证 reject 后行为(如状态更新、日志调用)的场景。注意必须返回 Promise 或显式 expect,否则 Jest 可能认为测试同步完成:
test('handleError is called on fetch failure', () => {
const handleError = jest.fn();
return fetchData('fail').catch(err => {
expect(handleError).toHaveBeenCalledWith(err);
});
});
避免未处理的 rejection 报警
Jest 默认对未被捕获的 Promise rejection 发出警告(Unhandled promise rejection warning)。即使你用 expect(...).rejects,也要确保:
• 被测函数确实返回 Promise(不是 void 或 undefined)
• 不在测试体外漏掉链式调用(比如忘记 return 或 await)
• 测试中没有其他并发 Promise 意外 rejected(可临时监听全局事件调试):
// 调试时临时添加(测试后移除)
beforeEach(() => {
jest.spyOn(global, 'console').mockImplementation(() => {});
window.addEventListener('unhandledrejection', e => {
console.error('Uncaught rejection:', e.reason);
});
});
用 expect().rejects 断言更简洁
Jest 提供的 .rejects 匹配器是专为 Promise rejection 设计的语法糖,内部自动处理等待和错误捕获:
-
expect(promise).rejects.toThrow('message')—— 断言抛出含指定文本的错误 -
expect(promise).rejects.toMatchObject({ code: 'ERR_NETWORK' })—— 断言错误对象结构 -
expect(promise).rejects.toBeInstanceOf(ValidationError)—— 断言错误构造函数
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











