Jest: 非同期のエラー例:ReferenceError:regeneratorRuntimeが定義されていません

作成日 2017年03月12日  ·  21コメント  ·  ソース: facebook/jest

このディレクトリから例を実行しようとすると、次のエラーが発生します。
https://github.com/facebook/jest/tree/master/examples/async

 FAIL  __tests__/user-test.js
  ● Test suite failed to run

    ReferenceError: regeneratorRuntime is not defined

      at Object.<anonymous> (__tests__/user-test.js:16:48)
      at process._tickCallback (internal/process/next_tick.js:103:7)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        1.495s
Ran all test suites.

同じ問題は、ノード6.10とノード7.7.4を使用して再現できます。

git clone https://github.com/facebook/jest jest
cd jest/examples/async
npm install
npm run test

最も参考になるコメント

これは、Jestの「ReferenceError:regeneratorRuntime isnotdefined」を修正するために機能しました。

npm install --save-dev @babel/plugin-transform-runtime

次に、.babelrcで(他のオプションを除く):

{
  "env": {
    "test": {
      "plugins": ["@babel/plugin-transform-runtime"]
    }
  }
}

全てのコメント21件

これは、CIまたはローカルでローカルに再現されません。 たぶんあなたのバージョンのnpmに何か問題がありますか?

@cpojer

クリスに感謝します。

この問題は、次のリポジトリのnode:latestを実行しているDockerコンテナから再現できます。
https://hub.docker.com/_/node/

エラーが発生する手順は次のとおりです。

# from local machine (also tested in vagrant 1.9.2 running ubuntu/trusty64)
docker pull node:latest
docker run --rm -it node bash
# from inside the container (docker version 17.03.0-ce, node version 7.7.2)
git clone https://github.com/facebook/jest /jest
cd /jest
# as per instructions from https://github.com/facebook/jest/tree/master/examples
npm install
cd examples/async
npm install
npm test

この例を実行する方法は正しいですか?
このシナリオを通過させるいくつかのグローバル要件を見逃している可能性はありますか?
追加情報を提供できますか?

編集:
devDependenciesでregeneration-runtimeをbabel-polyfillに置き換えると、この例が機能することがわかりました。

マスターのjestは実際には前のモジュールと互換性があると想定しますが、この例ではマスターコードを使用せず、代わりに、まだbabel-polyfillが必要な最新リリースをプルしています。

Travis CIで同じ問題が発生しています//travis-ci.org/okonet/lint-staged/jobs/212179781

ローカルでは正常に実行されているが、CIでは実行されていないテスト

私はちょうどこの問題にぶつかりました!

@mpontus @okonet修正されている場合は、 jest@nextを使用できます。それ以外の場合は、 babel-polyfillインストールする必要があります。

Jestは以前はbabel-polyfillを自動インクルードしていましたが(19.0.2でもこれを実行します)、メモリリークが発生したため、 regenerator-runtimeのみを使用するようになりました。 v20 npm> = 3またはyarnを使用している場合は、非同期/待機サポートのために何もインストールする必要はありません)。

問題は、ドキュメントからbabel-polyfillを削除したが、この差分https://github.com/facebook/jest/pull/275519.0.2に含めるのを忘れ、ロールアウトしなかったことです。それ以来、まともなリリース( jest@nextタグのみ)。
ご不便をおかけして申し訳ございません。

@thymikeeトランスフォームと一緒にドキュメントで説明されているようにregenerator-runtimeを使用するにはどうすればよいですか?
プロジェクトで.babelrcファイルを使用しておらず、以下のようにwebpackとjestの両方の構成で共有されるbabel構成をロードします。

jest.config.js

...
'transform': {
    '^.+\\.js$': '<rootDir>/config/jest.transform.js'
}
...

jest.transform.js

var babelConfig = require('./babel.config')

module.exports = require('babel-jest').createTransformer(babelConfig)

古い問題を目覚めさせて申し訳ありません。私はJest20.0.4で同じ問題に遭遇しており、これらのコメントの持ち帰りを実際に説明することはできません。 私が見ることができるものから:

  • async / awaitのドキュメントでは、 babel-preset-envを使用するようにアドバイスされていますが、 async / awaitの例では、代わりに
  • okonetと同様に、regeneratorRuntimeはCircleCIで発生しますが、ローカルでは--runInBandしてCIテストスクリプトをローカルで実行しても、それが問題であることを示しているわけではありません。
  • 根本的な原因は、CIではおそらく古いパッケージマネージャーを使用している場合、 regenerator-runtime直接インストールする必要があることのようです。

同じ問題に直面していました。 babel-polyfilljest.init.js (jestセットアップファイル)に直接インポートすると、問題が解決しました。

  ...
 "setupFiles": [
   "<rootDir>/jest.init.js"
  ],
  ...
/// jest.init.js
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import 'babel-polyfill';

バンプでごめんなさい! しかし、私は共有したかった😄。 私の一般的なプラグインにこれ​​を追加すると、私にとってはうまくいきます:

    [
      "transform-runtime",
      {
        "helpers": false,
        "polyfill": false,
        "regenerator": true
      }
    ]

しかし、これがそれを処理する最良の方法であるかどうかはわかりません。

これは、Jestの「ReferenceError:regeneratorRuntime isnotdefined」を修正するために機能しました。

npm install --save-dev @babel/plugin-transform-runtime

次に、.babelrcで(他のオプションを除く):

{
  "env": {
    "test": {
      "plugins": ["@babel/plugin-transform-runtime"]
    }
  }
}

同じ問題に直面していました。 babel-polyfilljest.init.js (jestセットアップファイル)に直接インポートすると、問題が解決しました。

  ...
 "setupFiles": [
   "<rootDir>/jest.init.js"
  ],
  ...
/// jest.init.js
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import 'babel-polyfill';

jest.init.jsポリフィルをインポートしようとしましたが、テストが奇妙に失敗しました。 未定義のジェネレーターエラーはありませんでしたが、コンポーネントのインポートや小道具の欠落など、以前のテストでは発生しなかったエラーがたくさんありました。

私のjest.conf.jsには次の行が含まれていました。

setupFiles: ['<rootDir>/test/unit/setup']

したがって、ポリフィルをjest.init.js (存在しなかった)ではなくsetup.jsにインポートする必要がありました。

import Vue from 'vue'
import '@babel/polyfill';

Vue.config.productionTip = false
Vue.config.silent = true

_polyfillインポート行を除いて、他の3行はファイルを開いたときにすでにファイルに含まれていました。_

setup.jsのポリフィルのインポートは機能しましたが、 jest.init.jsインポートは機能しませんでした(setupFilesパスを変更しました)。

現在のターゲットノードの追加は、Jestの「ReferenceError:regeneratorRuntime isnotdefined」を修正するために機能しました:

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "node": "current"
        }
      }
    ]
  ]
}

現在のターゲットノードの追加は、Jestの「ReferenceError:regeneratorRuntime isnotdefined」を修正するために機能しました:

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "node": "current"
        }
      }
    ]
  ]
}

これは実際にはbabelyfingの助けにはなりません、私のコードは現在のターゲットノードでコンパイルされません。 まったく同じように見えます(ES6)。 テストは実行されますが、コンパイルされたコードはありません:P

これが私のpackage.jsonの抜粋です、これは今私のために働きます。

"babel": {
    "presets": [
      [
        "@babel/preset-env",
        {
          "targets": {
            "node": "current"
          }
        }
      ],
      "@babel/preset-react"
    ],
    "plugins": [
      "component-identification",
      "@babel/plugin-proposal-class-properties",
      [
        "module-resolver",
        {
          "root": [
            "./src"
          ]
        }
      ]
    ]
  },

私にとっては、共通の構成でpreset-envターゲットを指定するだけでは不十分でした。
node下のenv.test nodeに対して、ターゲットを再度明示的に定義する必要がありました。

{
  'presets': [
    [
      '@babel/preset-env',
      {
        'targets': {
          'chrome': 61,
          'node': 8,
          'electron': '2.0.9'
        },
      }
    ],
    '@babel/typescript',
    '@babel/preset-react'
  ],
  'env': {
    'test': {
      'presets': [
        [
          '@babel/preset-env',
          {
            'targets': {
              'node': 8,  // <- ADDED
            },
          }
        ],
        '@babel/typescript',
      ]
    }
  }
}

私がしなければならなかった唯一のことは、@ AoDevによって言及されたようにbabelでターゲットを定義することです。 他に追加のターゲットはありません。

regenerator-runtimeをグローバルにインポートして定義するには、次のようにします。

require('regenerator-runtime/runtime');

必要なものを追加したいだけで、冗談のためにすべてのbabelポリフィルを追加することをいじりたくない人のために。

これは、Jest 24を紹介するブログ投稿で言及されていましたが、見逃した場合はhttps://jestjs.io/blog/2019/01/25/jest-24-refreshing-polished-typescript-friendly#breaking-changesです。 あなたは適切にbabelを設定する必要があり、コードを変更する必要はありません。 PRからのこのコメントを参照してください: https

@ghengeveldこれは私のための仕事です、ありがとう

私にとってそれを解決したのは、再生器だけでなく、ランタイムも構成に追加することでした。

  'globals': {
    'vue-jest': {
      'babelConfig': {
        'plugins': [
          '@babel/plugin-transform-regenerator',
          '@babel/plugin-transform-runtime',
        ],
        'presets': [['@babel/preset-env', { 'modules': false }]],
        'env': {
          'test': {
            'presets': [
              ['@babel/preset-env', { 'targets': { 'node': 'current' } }],
            ],
          },
        },
      },
    },
  },

@hereここでの試みはどれも

ReferenceError: regeneratorRuntime is not defined

これは私の私のpackage.jsonです
"devDependencies":{
"@ babel / core": "^ 7.6.2"、
"@ babel / plugin-transform-regenerator": "^ 7.8.7"、
"@ babel / runtime": "^ 7.9.6"、
"@ react-native-community / eslint-config": "^ 0.0.5"、
"babel-eslint": "^ 10.0.1"、
"babel-jest": "^ 24.9.0"、
"babel-plugin-module-resolver": "^ 3.1.3"、
"babel-plugin-transform-runtime": "^ 6.23.0"、
"デトックス": "^ 16.5.1"、

.babelrc
このファイルに何かを追加すると、アプリファイルが実行されなくなります。 リアクティブネイティブアプリを実行するには、このファイルを削除し直す必要があります

同じ問題が発生しました。 新鮮なjest (26.6.3)、単純な非同期テストとこれ。
それ自体を「楽しい」と定義するフレームワークの場合、これは実際にはそうではありません。
一体なぜ私はbabelの設定やプラグインなどを気にする必要があるのですか?
なぜ箱から出して動作しないのですか?

upd。 私の場合、私はすでにbabel.config.jsを持っていましたが、欠落していました
targets: { node: 'current' }

このページは役に立ちましたか?
0 / 5 - 0 評価