Jestがよくなったようなのでお試ししているのだが、testスクリプトでasyncを使うと、
ReferenceError: regeneratorRuntime is not defined
と出て困る。
僕はBabelを使っていて、拡張子を.es6
にしているのだが、そこが問題だった。
jest 19.0.2で確認
Before
.babelrc
{
"presets": ["react", "es2015", "stage-1"],
"plugins": [
"transform-function-bind",
["module-resolver", {
"root": ["./src"],
"alias": {
"src": "./src/js",
}
}]
],
"env": {
"development": {
"presets": [
"power-assert"
]
}
}
}
package.jsonのjest
"jest": {
"moduleFileExtensions": [
"es6",
"js"
],
"testMatch": [
"**/__tests__/**/*.es6"
],
"roots": [
"<rootDir>/src/js/"
],
"transform": {
"^.+\\.es6$": "babel-jest"
},
"
こうしていた。
原因
jestのjest-config/build/normalize.js
でbabelを使っているか判断し、使っている場合はbabel-polyfillを挿入する。みたいな処理をしているのだが、その判定ルーチンと上記設定の相性が悪かった。
const customJSPattern = Object.keys(config.transform).find(pattern => {
const regex = new RegExp(pattern);
return regex.test('a.js') || regex.test('a.jsx');
});
if (customJSPattern) {
const jsTransformer = Resolver.findNodeModule(
//$FlowFixMe
config.transform[customJSPattern],
{ basedir });
if (
jsTransformer && jsTransformer.includes(NODE_MODULES + 'babel-jest'))
{
babelJest = jsTransformer;
}
}
こんなコードになっているので、/^.+\\.es6$/
だとテストに通らない。
/^.+\\.(es6|js)$/
に直して動くようになった。
After
"jest": {
"moduleFileExtensions": [
"es6",
"js"
],
"testMatch": [
"**/__tests__/**/*.es6"
],
"roots": [
"<rootDir>/src/js/"
],
"transform": {
"^.+\\.(es6|js)$": "babel-jest"
},
"verbose": true
}
.es6
なんて使うなってことっぽい
ヒント
jestがうまく動かないときは、CacheDirectoryの中の変換済みコードを見ると捗る