导入Puppeteer辅助函数时Jest测试因覆盖率配置失败
问题解决:Jest覆盖率收集与Puppeteer辅助函数冲突
问题现象
开启Jest的collectCoverage: true后,导入独立文件的Puppeteer辅助函数setUpTest会抛出ReferenceError: cov_xxxxxx is not defined;关闭覆盖率、将函数写在测试文件内或注释page.evaluate调用时测试正常。
原因
Jest收集覆盖率时,会给所有匹配到的非测试文件注入覆盖率统计代码(即cov_xxxxxx变量)。但page.evaluate的回调函数是在浏览器环境执行的,而这个覆盖率变量仅存在于Node.js的测试环境中,浏览器无法识别,因此报错。当辅助函数放在独立文件(非.test.js)时,该文件会被Jest纳入覆盖率收集范围,导致回调代码被注入无效变量;而放在测试文件时,Jest默认不收集测试文件的覆盖率,因此不会出现这个问题。
解决方案
方案1:排除辅助函数文件的覆盖率收集
在jest.config.js中添加coveragePathIgnorePatterns,让Jest跳过对辅助函数文件的覆盖率注入:
/** @type {import('jest').Config} */ const config = { verbose: true, collectCoverage: true, preset: "jest-puppeteer", // 排除辅助函数文件,避免注入覆盖率代码 coveragePathIgnorePatterns: ["./set-up-test.js"] }; module.exports = config;
方案2:明确指定覆盖率收集的文件
如果只需要收集业务代码(如index.js)的覆盖率,可通过collectCoverageFrom精准配置,避免误收集辅助函数:
/** @type {import('jest').Config} */ const config = { verbose: true, collectCoverage: true, preset: "jest-puppeteer", // 仅收集业务代码的覆盖率 collectCoverageFrom: ["./index.js"] }; module.exports = config;
方案3:隔离浏览器执行代码(hack方式)
将page.evaluate的回调改为通过Function构造函数创建,绕过Jest的覆盖率注入:
修改set-up-test.js中的对应代码:
await page.evaluate(new Function(` console.log('set up') `))
推荐使用方案1或方案2,更符合常规配置习惯,且避免hack写法。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

