JavaScript单元测试中Mock Clipboard API需替换navigator.clipboard为可控Promise对象:在beforeEach中赋值mock方法并还原,兼容Node环境需手动挂载,覆盖PermissionDenied等错误场景,并确保secure context。

在 JavaScript 单元测试中 Mock Clipboard API,核心是替换全局的 navigator.clipboard 对象,使其返回可控的 Promise 行为,从而避免真实读写系统剪贴板。
手动替换 navigator.clipboard(适用于 Jest / Vitest)
最直接的方式是在测试前临时覆盖 navigator.clipboard,模拟 writeText、readText 等方法的返回值:
- 用
jest.mock()或直接赋值方式劫持navigator.clipboard - 确保 mock 方法返回
Promise.resolve()或Promise.reject(),匹配真实 API 的异步行为 - 注意:需在测试运行前设置,且建议在
beforeEach中还原,防止污染其他测试
示例(Jest):
beforeEach(() => {
Object.assign(navigator, {
clipboard: {
writeText: jest.fn().mockResolvedValue(),
readText: jest.fn().mockResolvedValue('mocked text'),
},
});
});
afterEach(() => {
jest.clearAllMocks();
});
使用 Clipboard API 的 polyfill 或测试专用库
某些测试环境(如 Node.js)不支持 navigator.clipboard,可借助轻量工具增强兼容性:
立即学习“Java免费学习笔记(深入)”;
-
clipboard-polyfill提供一致接口,可在测试中安全导入并 mock - Vitest 用户可配合
vi.mock模拟整个模块导出,更易控制内部逻辑 - 避免直接依赖浏览器全局对象,把 Clipboard 调用封装成可注入的服务,测试时传入 mock 实现
处理权限与拒绝场景
真实 Clipboard API 可能因权限被拒而抛错(如 "NotAllowedError"),Mock 时需覆盖这些边界情况:
- 让
writeText返回Promise.reject(new DOMException('Permission denied', 'NotAllowedError')) - 验证组件是否正确捕获错误、显示提示或降级处理
- 注意不同浏览器对
readText的权限要求更高,mock 时尤其要区分读/写行为
注意上下文安全性(Secure Context)限制
Clipboard API 只在 secure context(HTTPS 或 localhost)中可用。测试中若遇到 undefined,可能因环境不满足条件:
- Jest 默认运行在 Node 环境,
navigator.clipboard本就不存在,必须手动挂载 - Vitest 在浏览器模式下仍需确保测试页面以
http://localhost启动(而非file://) - 推荐统一通过
Object.defineProperty安全挂载,避免报错:
if (!navigator.clipboard) {
Object.defineProperty(navigator, 'clipboard', {
value: { writeText: jest.fn().mockResolvedValue() },
writable: true,
});
}


















