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

时间:2018-09-17 05:43:38

标签: node.js unit-testing code-coverage jestjs istanbul

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代码覆盖率(Istanbul)挂接到Node.js模块加载器中,并用coverage语句修饰模块主体,例如:

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

如何为该行启用覆盖率?

我宁愿不只是将foo标记为100%覆盖率,而是尽可能地将其标记为真实覆盖率,例如手动用覆盖率语句装饰fooSource

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

1 个答案:

答案 0 :(得分:1)

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

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