代码之家  ›  专栏  ›  技术社区  ›  Gpack

是否可以使用Jest收集vm.runInContext加载的代码的覆盖率?

  •  0
  • Gpack  · 技术社区  · 1 年前

    我正在处理一个遗留的JS项目,该项目不使用任何require/import。部署时,只需将文件连接起来,并将结果发送到服务器。

    为了用jest编写测试,我创建了一个自定义环境来加载全局上下文中的所有JS文件,这样我就可以调用测试文件中的函数。

    例如:

    src/索引js

    function sum(x, y) {
      return x + y;
    }
    

    src/index.spec.js文件

    it('should sum two numbers', () => {
      expect(sum(1, 2)).toBe(3);
    });
    

    jest.config.js

    module.exports = {
      clearMocks: true,
      collectCoverage: true,
      collectCoverageFrom: [
        "src/**/*.js",
      ],
      coverageDirectory: "coverage",
      coverageProvider: "v8",
      testEnvironment: "./jest.env.js",
    };
    

    笑话.env.js

    const NodeEnvironment = require('jest-environment-node').TestEnvironment;
    const fs = require('fs');
    const vm = require("vm");
    const path = require("path");
    
    class CustomEnv extends NodeEnvironment {
      constructor(config, context) {
        super(config, context);
        this.loadContext();
      }
    
      loadContext() {
        const js = fs.readFileSync('./src/index.js', 'utf8');
        const context = vm.createContext(this.global);
        vm.runInContext(js, context, {
          filename: path.resolve('./src/index.js'),
          displayErrors: true,
        });
        Object.assign(this.global, context);
      }
    }
    
    module.exports = CustomEnv;
    

    当我跑步时 npx jest ,测试已执行,但覆盖范围为空。。。 enter image description here

    你知道如何修复覆盖范围吗?

    我在这里创建了一个最小的可复制回购: https://github.com/GP4cK/jest-coverage-run-in-context/tree/main 。你可以克隆它,运行 npm i npm t 。 注意:我很乐意将v8更改为babel,或者以不同的方式加载上下文,如果这样做更容易的话。

    0 回复  |  直到 1 年前
        1
  •  1
  •   RandomGuy    1 年前

    您遇到的问题已在Jest存储库中报告。有关此问题的详细信息,请访问: https://github.com/facebook/jest/issues/9349 https://github.com/facebook/jest/issues/10645

    尽管解决了这个问题,但它从未被合并,而且已经过时。然而,有一个简单的解决方案,您可以将自己作为拉取请求进行贡献。您可以在以下位置找到建议的修复程序: https://github.com/facebook/jest/pull/10657 。修复程序尚未完成,因此需要有人来完成。

    要执行建议的修复程序,您需要在以下位置删除其中一个罪魁祸首: https://github.com/facebook/jest/blob/main/packages/jest-runtime/src/index.ts#L1268

    具体来说,您可以注释掉以下行:

    this._v8CoverageSources.has(res.url) &&

    您可以通过注释node_modules中的同一行,在本地快速测试修复:

    nodes_modules/jest运行时/build/index.js:1281

    希望这能有所帮助!