代码之家  ›  专栏  ›  技术社区  ›  Estus Flask

Jest/Istanbul对未加载require的模块的覆盖

  •  2
  • Estus Flask  · 技术社区  · 7 年前

    foo 包含作为Node.js模块加载时无法测试的行的模块:

    if (typeof module !== 'object') {
      do.something(); // line shows as uncovered
    }
    ...
    

    这条线路通常不能用 require('./foo') 因为 module 总是真实的,并且在没有连接到节点模块加载程序的情况下不能在模块外部模拟。

    所以我必须在没有 require 要完全控制模块局部变量:

    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%的覆盖率,但如果可能的话,像装饰 fooSource 手动使用覆盖率语句。

    我的出发点是 源代码不应该被修改以支持代码覆盖率;它在其他方面已经足够可测试了。

    1 回复  |  直到 7 年前
        1
  •  1
  •   vorillaz    7 年前

    在这种情况下,可以显式设置 NODE_ENV=test 你的测试套件。 Jest NODE_ENV 因此,您可以强制代码覆盖率为:

    if (typeof module !== 'object' || process.NODE_ENV === 'test') {
      do.something(); // line shows as uncovered
    }