【发布时间】:2018-09-17 05:43:38
【问题描述】:
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 模块加载器并使用覆盖率语句装饰模块主体,例如:
if (typeof module !== 'object') {
cov_v50bukkd.f[2]++;
do.something(); // shows as uncovered
}
如何为这条线路启用覆盖?
我不希望仅将 foo 标记为 100% 的覆盖率,而是尽可能使其成为真正的覆盖率,例如手动使用覆盖率语句装饰 fooSource。
我的出发点是不应修改foo 源代码以支持代码覆盖率;它在其他方面已经足够可测试了。
【问题讨论】:
标签: node.js unit-testing code-coverage jestjs istanbul