javascript单元测试中mock浏览器弹窗需拦截替换alert、confirm、prompt全局方法:用jest.fn()模拟行为,分别处理无返回值、布尔返回、字符串/null返回;测试后验证调用并 aftereach 清理。

JavaScript 单元测试中 Mock 浏览器弹窗函数,核心是**拦截并替换原生的 alert、confirm、prompt 全局方法**,避免测试被阻塞或产生真实 UI 干扰,同时能验证调用行为(是否被调用、传了什么参数、返回了什么值)。
覆盖三类原生弹窗函数
这三者都是挂载在 window(或全局作用域)上的同步函数,行为不同但 mock 方式一致:
-
alert(message):只显示,无返回值(
undefined) -
confirm(message):显示确认框,返回
true或false -
prompt(message, default):显示输入框,返回用户输入字符串或
null
用 jest.fn() 替换并控制返回值
在测试前(如 beforeEach)重写这些方法,利用 Jest 的 jest.fn() 灵活模拟行为:
- mock
alert:只需记录调用,不需返回值 - mock
confirm:用mockReturnValue(true)或mockReturnValueOnce(false)控制不同测试场景 - mock
prompt:可设默认返回'test-input',或用mockReturnValueOnce(null)模拟用户取消
示例:
在 Linux 上通过 Chrome 挂载/VNC 自动发布小红书长笔记。Agent 撰写标题和正文后执行 xhs_publish.sh --publish --submit,触发小红书发布。
beforeEach(() => {
global.alert = jest.fn();
global.confirm = jest.fn().mockReturnValue(true);
global.prompt = jest.fn().mockReturnValue('user-input');
});
验证调用细节与清理状态
测试执行后,通过 mock 函数的内置属性断言实际行为:
expect(alert).toHaveBeenCalledWith('Are you sure?')expect(confirm).toHaveBeenCalledTimes(1)expect(prompt).toHaveBeenNthCalledWith(1, 'Enter name:', 'default')
务必在 afterEach 中恢复原生方法(尤其在多测试文件共用环境时),防止污染:
delete global.alert;
delete global.confirm;
delete global.prompt;
});
注意浏览器环境差异
在 JSDOM(Jest 默认环境)中,这些函数本就不存在或行为异常,所以必须显式 mock;而在真实浏览器环境(如 Karma + Chrome)中,它们存在但会阻塞测试流程,同样需要 mock。不要依赖“它们本来就有”,而应统一以可控方式注入。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










