javascript中模拟剪贴板加密写入失败需绕过真实api并主动拒绝:1.用jest/vitest mock navigator.clipboard.write为reject promise;2.复现真实失败场景(非安全上下文、非用户手势、非法数据);3.开发时可手动覆盖write抛domexception;4.验证错误捕获、类型判断与ui恢复。

在 JavaScript 中模拟剪贴板加密写入失败(比如调用 navigator.clipboard.write() 被拒绝或抛出异常),关键在于**绕过真实 API,用可控的 mock 替换它,并主动触发拒绝行为**。浏览器原生剪贴板 API(尤其是涉及 Blob、ImageBitmap 等加密/敏感内容时)会检查权限、上下文(如是否在安全上下文、用户手势触发)、数据类型合法性等,失败时通常抛出 DOMException(如 "NotAllowedError"、"SecurityError"、"DataCloneError")。
1. 使用 Jest 或 Vitest 模拟 navigator.clipboard.write
测试环境下最常用方式是直接覆盖全局 navigator.clipboard 对象,返回一个自定义的 write 方法,让它返回被拒绝的 Promise:
// Jest/Vitest 测试文件中
beforeEach(() => {
// 保存原始 clipboard(可选)
const originalClipboard = navigator.clipboard;
// mock clipboard.write 为永远 reject
Object.assign(navigator, {
clipboard: {
write: jest.fn().mockRejectedValue(
new DOMException('Permission denied', 'NotAllowedError')
),
// 可选:同时 mock read,保持接口完整
read: jest.fn().mockResolvedValue([]),
},
});
// 清理(推荐在 afterEach 中恢复,避免污染其他测试)
afterEach(() => {
Object.assign(navigator, { clipboard: originalClipboard });
});
});
2. 手动触发“加密写入失败”的典型场景
真实失败不只靠 mock;理解哪些操作会自然触发失败,有助于设计更贴近实际的测试用例:
-
非安全上下文下调用:HTTP 页面中调用
clipboard.write()会直接抛SecurityError(无需 mock,但需确保测试环境是http://localhost或https) -
非用户手势触发:在
setTimeout、fetch回调等非点击/键盘事件中调用,会报"NotAllowedError" -
写入非法格式数据:例如传入未正确封装的
Blob、不支持的 MIME 类型、或包含跨域ImageBitmap,可能触发"DataCloneError"或"SecurityError"
3. 在非测试环境(如开发调试)中模拟失败
若想在浏览器控制台或本地调试时手动触发失败,可临时覆盖:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
// 在 DevTools 控制台执行(仅当前页面生效)
Object.assign(navigator.clipboard, {
write: async () => {
throw new DOMException('Write blocked by user setting', 'NotAllowedError');
}
});
之后再调用 navigator.clipboard.write([...]) 就会立即失败,方便验证你的错误处理逻辑(如 toast 提示、降级到 document.execCommand 或文本复制)是否生效。
4. 验证你的错误处理是否健壮
Mock 失败后,重点检查业务代码是否:
- 正确
catch异常,并区分错误类型(例如ex.name === 'NotAllowedError'提示“请手动复制”) - 没有因未捕获 Promise rejection 导致
Uncaught (in promise)报错 - 在失败后仍保持 UI 可用(如按钮恢复启用、加载态清除)
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










