Specify code to run before any Jest setup happens

前端 未结 3 1051
春和景丽
春和景丽 2021-02-11 23:24

The tl;dr is:

1) How can I have Jest use the native require function to load all modules in my tests anywhere.

2) Where / how would I go about modif

3条回答
  •  天命终不由人
    2021-02-12 00:02

    I tried using node -r @std/esm run.js where run.js is just a script that calls jest, but it does not work and crashes here : https://github.com/facebook/jest/blob/master/packages/jest-runtime/src/script_transformer.js#L305.

    From what I understand from this line means that it is not possible because jest compiles the module using the native vm module. The above lines (290):

      if (willTransform) {
        const transformedSource = this.transformSource(
        filename,
        content,
        instrument,
        !!(options && options.mapCoverage));
    
    
        wrappedCode = wrap(transformedSource.code);
        sourceMapPath = transformedSource.sourceMapPath;
      } else {
    

    is the code called when you are specifying transforms in your jest config.

    Conclusion : until esm are supported ( and they will be under the .mjs extension ) you cannot import es modules in jest without specifying a transform. You could try to monkey patch vm but I would really advise against this option.

    Specifying a jest transform is really not that hard, and for es modules it's really as simple as using babel-jest with the right babel config :

    Below a package.json with minimal settings

    {
        "dependencies": {
            "babel-jest": "^21.2.0",
            "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
            "jest": "^21.2.1"
        },
        "jest": {
            "testMatch": [
                "/src/**/__tests__/**/*.js?(x)",
                "/src/**/?(*.)(spec|test).js?(x)"
            ],
            "transform": {
                "^.+\\.(js|jsx)$": "/node_modules/babel-jest"
            },
            "testEnvironment": "node",
            "testURL": "http://localhost",
            "moduleFileExtensions": [
                "js",
                "json"
            ]
        },
        "babel": {
            "plugins": ["babel-plugin-transform-es2015-modules-commonjs"]
        }
    }
    

提交回复
热议问题