Jest无匹配文件时如何跳过对应覆盖率阈值校验
问题原因
Jest 默认要求所有在coverageThreshold中声明的路径规则必须存在对应的覆盖率数据,你使用--changedSince参数仅收集变更文件覆盖率时,若某条路径规则对应的目录下无任何变更文件,就不会生成对应路径的覆盖率数据,因此触发报错。
Jest: Coverage data for /components//*.js was not found
解决方案
方案1:使用Jest原生配置(适用Jest v29.2及以上版本)
Jest v29.2 版本新增了allowMissingCoverage属性,给每条路径规则配置该属性为true,即可在路径无匹配覆盖率数据时自动跳过校验,不会抛出错误。
修改后的配置如下:
"coverageThreshold": { "global": { "branches": 90, "functions": 90, "lines": 90, "statements": 90 }, "**/components/**/*.js": { "lines": 90, "allowMissingCoverage": true }, "**/containers/**/*.js": { "lines": 80, "allowMissingCoverage": true }, "**/actions/*.js": { "lines": 75, "allowMissingCoverage": true }, "**/utils/*.js": { "lines": 90, "allowMissingCoverage": true } }
方案2:动态生成阈值配置(兼容低版本Jest)
如果使用的Jest版本低于29.2,可以通过脚本动态生成coverageThreshold配置,仅将存在变更文件的路径规则加入配置中:
- 执行git命令对比目标分支,拉取所有变更的JS文件路径
- 匹配变更文件所属的目录类型,仅保留对应目录的阈值规则
- 最终生成的配置仅包含有变更文件的路径校验规则
示例jest.config.js逻辑如下:
const { execSync } = require('child_process'); const micromatch = require('micromatch'); // 获取和development分支对比的所有变更js文件 const changedFiles = execSync('git diff --name-only development -- "*.js"', { encoding: 'utf-8' }) .split('\n') .filter(Boolean); // 预设目录和对应阈值的映射 const dirThresholdMap = { '**/components/**/*.js': { lines: 90 }, '**/containers/**/*.js': { lines: 80 }, '**/actions/*.js': { lines: 75 }, '**/utils/*.js': { lines: 90 }, }; // 仅保留有变更文件匹配的阈值规则 const coverageThreshold = { global: { branches: 90, functions: 90, lines: 90, statements: 90 } }; Object.entries(dirThresholdMap).forEach(([glob, threshold]) => { if (micromatch.some(changedFiles, glob)) { coverageThreshold[glob] = threshold; } }); module.exports = { // 其余Jest配置项 coverageThreshold, };
使用该方案前需要先安装micromatch依赖用于路径匹配。
补充说明
你当前执行的命令多输入了一个连字符,修正后的命令为:jest --passWithNoTests --coverage --changedSince=development
内容的提问来源于stack exchange,提问作者paragxviii
相关产品推荐
相关产品推荐

