提升错误降级分支覆盖率需主动构造边界条件:mock navigator.clipboard = undefined 验证降级dom操作;mock permissions.query 返回 granted/denied/prompt 三态并检查手势依赖;mock execcommand 返回 false 及 select 抛错以触发多层兜底;断言 toast、按钮状态等ui反馈确保交互闭环。

要提升难以触达的错误降级分支的单元测试覆盖率,关键不是“等它出错”,而是主动构造边界条件、模拟环境限制、拦截底层行为,把原本依赖用户操作、权限弹窗或浏览器差异才能触发的路径,变成可重复、可断言的测试用例。
覆盖 API 不可用的原始分支
很多降级逻辑(比如 fallback 到 execCommand 或 textarea 操作)只在 navigator.clipboard 根本不存在时才执行。但仅靠 try/catch 无法捕获 ReferenceError —— 因为调用未定义属性会直接报错,不进 Promise 链。
- 在 Jest 中显式 mock
navigator.clipboard = undefined,再运行被测函数 - 验证是否执行了降级路径中的 DOM 操作(如创建临时
textarea、调用select()) - 检查最终返回值或副作用(如是否触发了 toast 提示、按钮状态是否变更)
模拟权限 API 的三种响应状态
现代剪贴板写入需 clipboard-write 权限,而 navigator.permissions.query() 可能返回 'granted'、'denied' 或 'prompt'。真实用户不会每次都点“允许”,测试必须覆盖拒绝和提示场景。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 用
jest.mock('navigator.permissions', ...)返回 resolve 不同状态的 Promise -
denied时应跳过writeText(),直接走降级;prompt时需确保只在用户手势(如 click)后才调用 - 特别注意 Chrome 125+ 对非手势触发的静默拒绝——测试中要模拟“无点击就调用”的情况,验证是否被拦截
让降级方案自身也“失败”一次
老式 execCommand('copy') 在 Firefox 90+ 默认禁用、iOS Safari 完全不支持,且可能静默失败(返回 false)。如果只测它“成功”,就漏掉了它失败后是否继续兜底。
- mock
document.execCommand返回false,验证是否进入更底层的textarea.select() → execCommand组合 - 进一步模拟
textarea.select()抛错(如元素未挂载、display: none),检查是否有最终兜底(如抛出自定义错误、显示友好提示) - 确认清理逻辑(移除临时 DOM 节点)在所有路径下都执行,避免内存泄漏
补全用户反馈链路的断言
复制成功/失败不只是技术动作,更是交互闭环。很多降级分支因缺少 UI 反馈而“看似工作”,实则体验断裂。
- 测试中注入 mock 的通知函数(如
showToast),断言其是否被调用、参数是否正确 - 若使用状态管理(如 React useState),可 shallow render 并检查 button 的
disabled或文案变化 - 对异步反馈(如复制后延时恢复按钮),用
await waitFor(() => expect(...))等待状态更新










