mock window.onerror需先保存原函数再替换,真实抛出未捕获异常以触发捕获,断言5个参数后还原;promise拒绝需单独mock unhandledrejection事件。

在 JavaScript 单元测试中,Mock window.onerror 的核心是**临时替换它,并确保能捕获和验证错误参数,同时不影响原始行为或其它测试用例**。关键点在于:保存原函数、设置模拟函数、触发错误、断言、还原(restore)。
保存并替换 onerror
直接赋值给 window.onerror 即可覆盖,但必须先缓存原始函数(尤其在 Jest 等测试框架中,多个测试可能共用全局环境):
const originalOnError = window.onerror; window.onerror = jest.fn(); // 或 () => true
注意:window.onerror 是一个函数,返回 true 表示已处理、阻止默认错误报告;返回 false 或 undefined 会继续冒泡。Mock 时可根据需要控制返回值。
正确触发错误以被捕获
不能只调用 window.onerror(...) 手动执行 —— 这绕过了浏览器的错误捕获机制。必须**真实抛出未捕获异常**,例如:
-
throw new Error('test error');(同步) -
setTimeout(() => { throw new Error('async error'); }, 0);(异步,需注意测试异步等待) -
eval('throw new Error("eval error");');(慎用,但可触发 onerror)
Jest 中推荐配合 jest.runAllTimers() 或 await waitFor(() => ...) 确保异步错误被捕获。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
断言参数与还原环境
window.onerror 回调接收 5 个参数:(message, source, lineno, colno, error)。Mock 后可断言:
expect(window.onerror).toHaveBeenCalledWith( 'test error', expect.any(String), expect.any(Number), expect.any(Number), expect.any(Error) );
测试结束后务必还原:
window.onerror = originalOnError;
更稳妥的做法是在 beforeEach 和 afterEach 中统一管理,避免测试间污染。
补充:兼容 Promise 拒绝(unhandledrejection)
window.onerror 不捕获 Promise rejection。如需覆盖完整错误场景,还需 Mock window.addEventListener('unhandledrejection'):
const originalOnUnhandledRejection = window.addEventListener;
window.addEventListener = jest.fn();
// 触发:Promise.reject(new Error('promise error'));
但注意:这属于不同事件机制,不可与 onerror 混淆。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










