有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_ENV=test
。 Jest自动设置NODE_ENV
,因此您可以强制执行代码覆盖:
if (typeof module !== 'object' || process.NODE_ENV === 'test') {
do.something(); // line shows as uncovered
}