有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
源代码以支持代码覆盖率;在其他方面已经可以测试了。
答案 0 :(得分:1)
在这种情况下,您可以为测试套件明确设置NODE_ENV=test
。 Jest会自动将NODE_ENV
设置为这样,因此您可以强制执行以下代码覆盖率:
if (typeof module !== 'object' || process.NODE_ENV === 'test') {
do.something(); // line shows as uncovered
}