如何让Jest在统计覆盖率时忽略JSDoc注释?
解决Jest误将JSDoc注释统计为已覆盖代码的问题
问题场景
无任何测试用例时,Jest的代码覆盖率统计错误地将JSDoc注释判定为已覆盖代码,导致覆盖率结果失真。
示例代码(index.js)
/** * Calculates a sum of all givens numbers * * @example sum(1,1); // 2 * @example sum(1,2,-5,2.4,-6.5); // -6.1 * @example sum(1,2,3,4,5,6,7,8,9,0); // 45 * @example sum(-1,2,3,4,5,6,7,8,-9); // 25 * * @param {...number} numbers - the numbers to sum * @returns {number} summ of all numbers * * @function sum */ export function sum(...numbers) { return numbers.reduce((acc, curr) => acc + curr, 0); }
当前错误覆盖率输出
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ---------|---------|----------|---------|---------|------------------ index.js | 88.23 | 100 | 0 | 88.23 | 16-17
期望覆盖率输出
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ---------|---------|----------|---------|---------|------------------ index.js | 0 | 0 | 0 | 0 | ...
解决方案
1. 升级Jest到最新稳定版
旧版本Jest或其依赖的覆盖率工具可能存在注释识别bug,升级后通常能解决这类问题:
npm install --save-dev jest@latest
2. 配置Babel插件精准排除注释统计
如果使用Babel转译,安装babel-plugin-istanbul并配置它忽略注释类内容:
- 安装依赖:
npm install --save-dev babel-plugin-istanbul
- 在
babel.config.js中添加配置:
module.exports = { env: { test: { plugins: [ ["istanbul", { "exclude": ["**/*.jsdoc", "**/*.md"], "ignoreClassMethods": [], "ignoreFunctionMethods": [] }] ] } } };
3. 切换到V8覆盖率提供者
Jest支持V8和Istanbul两种覆盖率收集器,V8对现代JS语法和注释的处理更准确。在jest.config.js中设置:
module.exports = { coverageProvider: "v8" };
4. 精准指定覆盖率收集范围
在jest.config.js中通过collectCoverageFrom明确只统计业务代码,避免误判:
module.exports = { collectCoverageFrom: [ "src/**/*.js", "!**/*.test.js", "!**/__mocks__/**" ] };
验证
完成配置后,重新执行覆盖率命令:
jest --coverage
此时无测试用例的情况下,所有覆盖率指标应显示为0%,符合预期。
内容的提问来源于stack exchange,提问作者Flavio Silva
相关产品推荐
相关产品推荐

