Node.js Jest/ISTANBAL对非';t装载着需求
有一个Node.js Jest/ISTANBAL对非';t装载着需求,node.js,unit-testing,code-coverage,jestjs,istanbul,Node.js,Unit Testing,Code Coverage,Jestjs,Istanbul,有一个foo模块,它包含在作为Node.js模块加载时无法测试的行: if (typeof module !== 'object') { do.something(); // line shows as uncovered } ... 通常无法使用require('./foo')测试该行,因为模块始终是真实的,如果不连接到节点模块加载器,就无法在模块外部模拟该行 因此,我必须在不要求对模块局部变量进行完全控制的情况下对其进行评估: const fooSource = fs.readFile
foo
模块,它包含在作为Node.js模块加载时无法测试的行:
if (typeof module !== 'object') {
do.something(); // line shows as uncovered
}
...
通常无法使用require('./foo')
测试该行,因为模块
始终是真实的,如果不连接到节点模块加载器,就无法在模块外部模拟该行
因此,我必须在不要求对模块局部变量进行完全控制的情况下对其进行评估:
const fooSource = fs.readFileSync(fooPath);
new Function('module', fooSource)();
expect(do.something).toHaveBeenCalled();
这是可行的,但测试覆盖率忽略了此测试
据我所知,Jest code coverage(伊斯坦布尔)钩住Node.js模块加载器,并用coverage语句装饰模块体,例如:
if (typeof module !== 'object') {
cov_v50bukkd.f[2]++;
do.something(); // shows as uncovered
}
如何为该行启用覆盖范围
我不希望仅仅用100%的覆盖率来标记foo
,而是尽可能使其成为真正的覆盖率,比如用覆盖率语句手动装饰fooSource
我的出发点是,源代码不应该被修改以支持代码覆盖率;它在其他方面已经足够可测试了。在这种情况下,您可以显式地为测试套件设置
NODE\u ENV=test
。自动设置节点_ENV
,以便您可以强制执行代码覆盖率:
if (typeof module !== 'object' || process.NODE_ENV === 'test') {
do.something(); // line shows as uncovered
}
谢谢我想这是最简单的解决方案,但它不能回答问题。我对测试这条线没有任何问题,只是得到了测试覆盖率。此外,应该测试该行并不意味着每次都应该运行is,但这将发生在
NODE\u ENV=test
上。正如问题所说,我从一个事实出发,即不应该修改foo源代码来支持代码覆盖率。我想谈谈问题本身所述的问题,至少是为了自我教育。它实际上回答了你如何报告这一特定案例的覆盖范围。就我而言,像伊斯坦布尔这样的覆盖率报告工具用覆盖率语句和helpers函数来装饰一切,以便静态地分析代码。我不认为为了支持伊斯坦布尔而修改源代码是个好主意。顺便说一句,看看有条件的评论,它们通常用于指导伊斯坦布尔的装饰师。我看到了手工修饰代码的真正问题,但似乎不可能让伊斯坦布尔实例来做这件事。请考虑用评论选项更新答案,我想这是最普遍可行的方法,可以被普遍推荐,类似于UMD包装器。