Jest: Fehler in Async Beispiel: ReferenceError: regeneratorRuntime ist nicht definiert

Erstellt am 12. März 2017  ·  21Kommentare  ·  Quelle: facebook/jest

Ich erhalte folgende Fehlermeldung, wenn ich versuche, ein Beispiel aus diesem Verzeichnis auszuführen:
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.

Das gleiche Problem kann mit Knoten 6.10 und Knoten 7.7.4 reproduziert werden:

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

Hilfreichster Kommentar

Dies hat bei mir funktioniert, um "ReferenceError: regeneratorRuntime is not defined" in Jest zu beheben:

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

Dann in .babelrc (neben anderen Optionen):

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

Alle 21 Kommentare

Dies wird nicht lokal in unserem CI oder lokal reproduziert. Vielleicht stimmt etwas mit Ihrer Version von npm nicht?

@cpojer

Danke Chris.

Dieses Problem kann aus dem Docker-Container reproduziert werden, auf dem node:latest aus dem folgenden Repository ausgeführt wird:
https://hub.docker.com/_/node/

Nachfolgend sind die Schritte aufgeführt, die zu einem Fehler führen:

# 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

Liege ich mit der Ausführung dieses Beispiels richtig?
Ist es möglich, dass ich einige globale Anforderungen übersehe, die dieses Szenario erfolgreich machen?
Kann ich Ihnen zusätzliche Informationen anbieten?

Bearbeiten:
Ich habe festgestellt, dass das Beispiel funktioniert, wenn Sie die Regeneration-Laufzeit durch babel-polyfill in devDependencies ersetzen.

Ich gehe davon aus, dass jest in master tatsächlich mit dem vorherigen Modul kompatibel ist, aber das Beispiel verwendet keinen Master-Code und zieht stattdessen die neueste Version, die möglicherweise noch Babel-Polyfill erfordert.

Ich habe das gleiche Problem mit Travis CI: https://travis-ci.org/okonet/lint-staged/jobs/212179781

Tests laufen lokal in Ordnung, aber nicht auf CI

Ich bin gerade auf dieses Problem gestoßen!

@mpontus @okonet Sie können jest@next wo es behoben ist, oder Sie müssen ansonsten babel-polyfill installieren.

Jest hat babel-polyfill automatisch eingefügt (und tut es immer noch in 19.0.2), aber da es Speicherlecks verursachte, haben wir nur regenerator-runtime , das mit unseren transitiven Deps ausgeliefert wird (also seit Jest v20, wenn Sie npm >=3 oder Garn verwenden, müssen Sie nichts für die Async/Await-Unterstützung installieren).

Das Problem ist, dass wir babel-polyfill aus den Dokumenten entfernt haben, aber vergessen haben, dieses Diff https://github.com/facebook/jest/pull/2755 in 19.0.2 und es nicht eingeführt hat seitdem ordentliche Veröffentlichung (nur jest@next Tag).
Entschuldigung für die Unannehmlichkeiten!

@thymikee Wie kann ich regenerator-runtime wie in den Dokumenten beschrieben zusammen mit einer Transformation verwenden?
Ich verwende keine .babelrc Datei in meinem Projekt und lade eine Babel-Konfiguration, die wie unten sowohl für die Webpack- als auch für die Jest-Konfiguration freigegeben ist:

jest.config.js

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

scherz.transform.js

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

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

Es tut mir leid, ein altes Problem aufzuwecken: Ich habe das gleiche Problem mit Jest 20.0.4 und kann diese Kommentare nicht wirklich nachvollziehen. Von dem was ich sehen kann:

  • Die async/await-Dokumentation empfiehlt, babel-preset-env , aber das async/await-Beispiel verwendet stattdessen
  • Wie okonet taucht die regeneratorRuntime auf --runInBand zeigt nicht an, dass dies das Problem ist.
  • Es sieht so aus, als ob die Hauptursache darin besteht, dass regenerator-runtime direkt installiert werden muss, wenn Sie einen älteren Paketmanager verwenden, was unter CI wahrscheinlich ist.

Ich hatte das gleiche Problem, das Importieren von babel-polyfill direkt in die jest.init.js (jest Setup-Datei) löste das Problem für mich.

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

Entschuldigung für die Beule! Aber ich wollte teilen 😄 . Das Hinzufügen in meinen allgemeinen Plugins funktioniert für mich:

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

Ich weiß allerdings nicht, ob das der beste Weg ist, damit umzugehen.

Dies hat bei mir funktioniert, um "ReferenceError: regeneratorRuntime is not defined" in Jest zu beheben:

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

Dann in .babelrc (neben anderen Optionen):

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

Ich hatte das gleiche Problem, das Importieren von babel-polyfill direkt in die jest.init.js (jest Setup-Datei) löste das Problem für mich.

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

Ich habe versucht, das Polyfill in jest.init.js importieren, aber es hat meine Tests seltsam gebrochen. Ich hatte nicht den undefinierten Generatorfehler, aber ich hatte viele Fehler, die ich zuvor in meinen Tests nicht hatte, wie fehlende Komponentenimporte oder fehlende Requisiten.

Mein jest.conf.js enthielt die folgende Zeile:

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

Daher musste ich das Polyfill in setup.js anstelle von jest.init.js (das nicht existierte) importieren:

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

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

_Mit Ausnahme der Polyfill-Importzeile waren die 3 anderen Zeilen bereits in der Datei, als ich sie öffnete._

Das Importieren des Polyfills in setup.js funktionierte, während das Importieren in jest.init.js nicht funktionierte (ich habe den setupFiles-Pfad geändert).

Das Hinzufügen von Zielknotenstrom hat für mich funktioniert, um "ReferenceError: regeneratorRuntime is not defined" in Jest zu beheben:

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

Das Hinzufügen von Zielknotenstrom hat für mich funktioniert, um "ReferenceError: regeneratorRuntime is not defined" in Jest zu beheben:

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

Dies wird dem Babelyfing nicht wirklich helfen, mein Code wird nicht mit dem aktuellen Zielknoten kompiliert. Es sieht genauso aus (ES6). Tests würden laufen, toll, aber kein kompilierter Code :P

Hier ist ein Ausschnitt meiner package.json, das funktioniert jetzt für mich.

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

Für mich reichte es nicht aus, Preset-Env-Ziele in der gemeinsamen Konfiguration anzugeben.
Ich musste die Ziele für node unter env.test einmal explizit definieren.

{
  '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',
      ]
    }
  }
}

Das einzige, was ich tun musste, war, das Ziel in Babel zu definieren, wie von @AoDev erwähnt. Keine weiteren Ziele woanders.

Um regenerator-runtime global zu importieren und zu definieren, gehen Sie wie folgt vor:

require('regenerator-runtime/runtime');

Für diejenigen, die nur das erforderliche Ding hinzufügen und nicht mit dem Hinzufügen aller Babel-Polyfills zum Spaß herumspielen möchten.

Dies wurde im Blogbeitrag zur Einführung von Jest 24 erwähnt, falls die Leute es verpasst haben: https://jestjs.io/blog/2019/01/25/jest-24-refreshing-polished-typescript-friendly#breaking -changes. Sie müssen Babel richtig konfigurieren und müssen keinen Code ändern. Siehe diesen Kommentar aus der PR: https://github.com/facebook/jest/pull/7595#issuecomment -454486373

@ghengeveld Das ist Arbeit für mich, danke

Was es für mich gelöst hat, war, nicht nur den Regenerator, sondern auch die Laufzeit zu meiner Konfiguration hinzuzufügen:

  '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' } }],
            ],
          },
        },
      },
    },
  },

@hier hat keiner der Versuche hier für mich

ReferenceError: regeneratorRuntime is not defined

Das ist mein Paket.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-scherz": "^24.9.0",
"babel-plugin-module-resolver": "^3.1.3",
"babel-plugin-transform-runtime": "^6.23.0",
"Entgiftung": "^16.5.1",

.babelrc
Immer wenn ich dieser Datei etwas hinzufüge, werden meine App-Dateien nicht ausgeführt. Ich muss diese Datei wieder löschen, damit meine reaktive native App ausgeführt wird

Auf das gleiche Problem gestoßen. Frischer jest (26.6.3), einfacher asynchroner Test und das..
Für ein Framework, das sich selbst als "entzückend" definiert, ist dies wirklich nicht der Fall.
Warum um alles in der Welt muss ich mich um die Konfiguration von Babel, Plugins usw.
Warum funktioniert es nicht out of the box?

upd. In meinem Fall hatte ich bereits babel.config.js, aber es fehlte
targets: { node: 'current' }

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen