有一个 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 模块加载器并使用覆盖率语句装饰模块主体,例如:
if (typeof module !== 'object') {
cov_v50bukkd.f[2]++;
do.something(); // shows as uncovered
}
如何为这条线启用覆盖?
我不希望只将 foo
标记为 100% 覆盖率,而是尽可能使其真正覆盖,例如手动使用覆盖率语句装饰 fooSource
。
我的出发点是,不应修改 foo
源代码以支持代码覆盖率;它在其他方面已经足够可测试。
最佳答案
在这种情况下,您可以为您的测试套件显式设置 NODE_ENV=test
。 Jest自动设置 NODE_ENV
这样您就可以强制执行代码覆盖率:
if (typeof module !== 'object' || process.NODE_ENV === 'test') {
do.something(); // line shows as uncovered
}
关于node.js - Jest/Istanbul 覆盖未加载 require 的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52361373/