gpt4 book ai didi

node.js - Jest/Istanbul 覆盖未加载 require 的模块

转载 作者:搜寻专家 更新时间:2023-10-31 23:57:12 25 4
gpt4 key购买 nike

有一个 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=testJest自动设置 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com