Jest / Istanbul覆盖未加载require的模块

问题描述 投票:2回答:1

foo模块,其中包含在作为Node.js模块加载时无法测试的行:

if (typeof module !== 'object') {
  do.something(); // line shows as uncovered
}
...

这条线通常不能用require('./foo')进行测试,因为module总是很简单,不能在没有连接到Node模块加载器的情况下在模块外部进行模拟。

因此,我必须在没有require的情况下对其进行评估,以便完全控制模块局部变量:

const fooSource = fs.readFileSync(fooPath);
new Function('module', fooSource)();
expect(do.something).toHaveBeenCalled();

这有效,但测试覆盖率会忽略此测试。

据我所知,Jest代码覆盖(伊斯坦布尔)挂钩到Node.js模块加载器并用coverage语句装饰模块体,例如:

if (typeof module !== 'object') {
  cov_v50bukkd.f[2]++;
  do.something(); // shows as uncovered
}

如何为此线路启用覆盖范围?

我宁愿不仅仅用100%的覆盖率来标记foo,但如果可能的话,可以使它真正覆盖,比如手动用覆盖语句装饰fooSource

我从foo源代码不应修改以支持代码覆盖的事实出发;它在其他方面已经足够可测试了。

node.js unit-testing code-coverage jestjs istanbul
1个回答
1
投票

在这种情况下,您可以为测试套件明确设置NODE_ENV=testJest自动设置NODE_ENV,因此您可以强制执行代码覆盖:

if (typeof module !== 'object' || process.NODE_ENV === 'test') {
  do.something(); // line shows as uncovered
}
© www.soinside.com 2019 - 2024. All rights reserved.