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

标签 node.js unit-testing code-coverage jestjs istanbul

有一个 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/

相关文章:

javascript - 检查 Node.js 中的值是否可以序列化为 JSON

javascript - PDF A4 页面中的网站内容不响应

node.js - Angular2 Visual Studio 2017 MVC : Uncaught TypeError: System. 配置不是一个函数

c# - NUnit Collection 断言列表中的项目在另一个项目之后/之前

python - 如何省略使用 python 覆盖库?

javascript - Node.js promise 链接

c - 使用检查在 C 中调试单元测试

unit-testing - Realm.io 迁移的 RealmSwift 单元测试

intellij-idea - IntelliJ IDEA : Exclude packages while running code coverage

python - 运行 py.test 时的 .coveragerc 文件位置