我正在尝试为打字稿项目设置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编译器输出的代码存在某种冲突,但我无法追踪它 .