我正在尝试为打字稿项目设置jest . 我在配置项目时遇到问题,以便我可以测试生成器 .

我有以下简化的测试用例

// my.test.ts    
import * as expect from 'expect';

function* testGenerator() {
  return true;
}

describe('testcase', () => {
  it('should see the regeneratorRuntime', () => {
    expect(true).toBe(true);
  });
});

因为我正在使用打字稿,所以我将Jest配置为使用预处理脚本,该脚本首先将打字稿编译为javascript,然后使用babel转换输出 . 我的jest配置看起来像这样 .

// package.json   
...     
  "jest": {
        "transform": {
          ".(ts|tsx)": "<rootDir>/internals/scripts/jestPreprocessor.js"
        },
        "testMatch": [
          "**/*.test.(ts|tsx|js|jsx)"
        ],
        "moduleFileExtensions": [
          "ts",
          "tsx",
          "js",
          "jsx"
        ]   }, ...

我的开玩笑预处理器看起来像这样(我found here

const tsc = require('typescript');
const tsConfig = require('../../tsconfig.json');
const babelJest = require('babel-jest')

module.exports = {
    process(src, path) {
        const isTs = path.endsWith('.ts');
        const isTsx = path.endsWith('.tsx');
        if (isTs || isTsx) {
            src = tsc.transpileModule(src, tsConfig);
            src = src.outputText;
            // update the path so babel can try and process the output
            path = path.substr(0, path.lastIndexOf('.')) + (isTs ? '.js' : '.jsx') || path;
        }

        if (path.endsWith('.js') || path.endsWith('.jsx')) {
            src = babelJest.process(src, path);
        }
        return src;
    },
};

将_Thiscript转换为javascript,然后将文件扩展名更改为 js ,以便babel可以解析它,然后将src传递给babel-jest .

所以只留下babel配置,看起来像这样(在package.json中)......

"babel": {
    "presets": [
      "react",
      ["env", {
        "targets": {
          "browsers": [
            "Chrome >= 52",
            "FireFox >= 44",
            "Safari >= 7",
            "Explorer 11",
            "last 4 Edge versions"
          ]
        },
        "debug": true
      }]
    ],
    "env": {
      "production": {
        "only": [
          "app"
        ],
        "plugins": [
          "transform-react-remove-prop-types",
          "transform-react-constant-elements",
          "transform-react-inline-elements"
        ]
      },
      "test": {
        "plugins": [
          "istanbul"
        ]
      }
    }
  },

我正在使用 babel-preset-env 插件管理我所针对的环境的插件和polyfill .

如果我运行测试,我会收到以下错误

ReferenceError: regeneratorRuntime is not defined

但我可以看到'transfrom-regenerator'插件被包含,因为 babel-preset-env 的调试输出

但是,如果我将 "exclude": ["transfrom-regenerator"] 添加到babel-preset-env配置中,就像这样

["env", {
    "targets": {
        "browsers": [
            "Chrome >= 52",
            "FireFox >= 44",
            "Safari >= 7",
            "Explorer 11",
            "last 4 Edge versions"
        ]
    },
    "exclude": ["transform-regenerator"],
    "debug": true
}]

我的测试运行,我没有得到错误 . 哪个适合测试,但对IE11不好 .

我无法弄清楚为什么包含 transform-regenerator 插件导致Jest中的 regeneratorRuntime 错误 . 我怀疑与TypeScript编译器输出的代码存在某种冲突,但我无法追踪它 .