第三方依赖不应计入代码覆盖率,需在插桩阶段通过配置排除路径(如node_modules、dist、.d.ts文件),而非运行时判断;主流工具均支持路径级过滤,mock第三方库不影响自身逻辑覆盖,且需覆盖错误处理分支。

第三方依赖本身不该计入你的代码覆盖率,但默认情况下,工具可能误扫其源码(比如本地调试时 link 的包),导致覆盖率失真。关键不是“不测它”,而是“不让它进统计范围”——排除动作发生在插桩阶段,配置对了,node_modules、dist、类型声明文件这些就根本不会被解析和计数。
按工具配好排除路径
所有主流工具都支持路径级过滤,不是靠在测试里写 if (process.env.TEST) 这类运行时判断:
-
Jest:在
jest.config.js中加coveragePathIgnorePatterns: ['<rootdir>/node_modules/', '.*\.d\.ts$']</rootdir>;正则会自动转成 RegExp,<rootdir></rootdir>是项目根目录别名 -
Vitest:在
vitest.config.ts的coverage.exclude里填 glob 模式,例如['node_modules', 'dist', '**/*.test.*'];注意它不识别正则,只认 glob -
nyc / Istanbul:在
.nycrc或package.json#nyc中设"exclude": ["node_modules/**", "dist/**"];支持 glob 和绝对路径
排除 ≠ 忽略测试逻辑
你依然可以 import axios from 'axios',也仍需用 vi.mock('axios') 或 jest.mock 模拟行为。排除只是让 axios 的源码不参与插桩,不影响你自己的函数调用链是否被覆盖:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 如果你没 mock,而 service 层写了
await axios.get('/api'),这行调用本身可能被统计(因为它是你写的源码),但 axios 内部不会; - 所以更稳妥的做法是显式 mock 所有第三方导入,并确保 mock 后的调用路径清晰可验证;
- mock 不是为了躲覆盖率,而是为了控制输入输出,让测试真正聚焦在你的逻辑上。
动态代码不参与覆盖率统计
像 eval('x + y')、new Function('return a * b') 或模板字符串拼接后执行的内容,天然不在覆盖率范围内。因为插桩只作用于静态解析的源文件,而这类代码在运行时才生成,没有 AST 节点,也没法映射行号。V8 引擎执行的是字节码,覆盖率工具无从插桩。Chrome DevTools 的 Coverage 面板同样无法标记它们——它只识别已加载的脚本资源,不追踪字符串求值过程。
别让 mock 掩盖真实缺口
mock 第三方依赖时,容易漏掉错误处理分支。比如只 mock 成功响应,却没覆盖 catch 块里的重试或降级逻辑。覆盖率报告里如果显示某段 if (err?.response?.status === 500) 分支未亮,就说明你还没构造出触发它的测试场景。这时候补一个 mock 返回 500 状态的响应,比单纯提高数字更有价值。










