Jest: Ошибка в асинхронном примере: ReferenceError: regeneratorRuntime не определен

Созданный на 12 мар. 2017  ·  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

Самый полезный комментарий

Это сработало для меня, чтобы исправить «ReferenceError: regeneratorRuntime не определен» в Jest:

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

Затем в .babelrc (помимо других вариантов):

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

Все 21 Комментарий

Это не воспроизводится локально на нашем CI или локально. Может быть, что-то не так с вашей версией npm?

@cpojer

Спасибо, Крис.

Эту проблему можно воспроизвести из контейнера докеров, на котором запущен node:latest из следующего репозитория:
https://hub.docker.com/_/узел/

Ниже приведены шаги, которые приводят к ошибке:

# 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

Правильно ли я выполняю этот пример?
Возможно ли, что я пропускаю некоторые глобальные требования, которые сделают этот сценарий пройденным?
Могу ли я предложить вам дополнительную информацию?

Редактировать:
Я обнаружил, что этот пример работает, если вы замените regeneration-runtime на babel-polyfill в devDependencies.

Я собираюсь предположить, что jest в мастере на самом деле совместим с предыдущим модулем, но в примере не используется мастер-код, а вместо этого используется последний выпуск, для которого все еще может потребоваться babel-polyfill.

У меня такая же проблема с Travis CI: https://travis-ci.org/okonet/lint-staged/jobs/212179781

Тесты работают нормально локально, но не в CI

Я только что столкнулся с этой проблемой!

@mpontus @okonet вы можете использовать jest@next там, где это исправлено, или в противном случае вам нужно установить babel-polyfill .

Раньше Jest автоматически включал babel-polyfill (и до сих пор делает это в версии 19.0.2), но поскольку это вызывало утечку памяти, мы перешли к использованию только regenerator-runtime , который поставляется с нашими транзитивными зависимостями (так как Jest v20, если вы используете npm>=3 или yarn, вам не нужно ничего устанавливать для поддержки async/await).

Проблема в том, что мы удалили babel-polyfill из документов, но забыли включить этот diff https://github.com/facebook/jest/pull/2755 в 19.0.2 и не развернули достойный релиз с тех пор (только тег jest@next ).
Извините за неудобства!

@thymikee Как я могу использовать regenerator-runtime как описано в документации, вместе с преобразованием?
Я не использую какой-либо файл .babelrc в своем проекте и загружаю конфигурацию babel, которая используется как для веб-пакета, так и для конфигурации jest, как показано ниже:

jest.config.js

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

шутка.transform.js

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

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

Извините, что разбудил старую проблему: я столкнулся с той же проблемой с Jest 20.0.4 и не могу понять суть этих комментариев. Из того, что я вижу:

  • В документации по async/await рекомендуется использовать babel-preset-env , но в примере с используется babel-plugin-transform-runtime . Какая рекомендуемая зависимость?
  • Как и okonet , regeneratorRuntime возникает в CircleCI, но не локально. Запуск моего тестового сценария CI локально с --runInBand не указывает на то, что это проблема.
  • Похоже, основная причина заключается в том, что regenerator-runtime необходимо установить напрямую, если вы используете более старый менеджер пакетов, что, вероятно, в CI.

Я столкнулся с той же проблемой, импорт babel-polyfill непосредственно в jest.init.js (файл настройки шутки) решил проблему для меня.

  ...
 "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
      }
    ]

Однако я не знаю, лучший ли это способ справиться с этим.

Это сработало для меня, чтобы исправить «ReferenceError: regeneratorRuntime не определен» в Jest:

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

Затем в .babelrc (помимо других вариантов):

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

Я столкнулся с той же проблемой, импорт babel-polyfill непосредственно в jest.init.js (файл настройки шутки) решил проблему для меня.

  ...
 "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']

Поэтому мне пришлось импортировать полифилл в setup.js вместо jest.init.js (которого не существовало):

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

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

_За исключением строки импорта полифилла, 3 другие строки уже были в файле, когда я его открыл._

Импорт полифилла в setup.js работал, а импорт в jest.init.js не работал (я изменил путь к setupFiles).

Добавление текущего узла цели помогло мне исправить «ReferenceError: regeneratorRuntime не определено» в Jest:

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

Добавление текущего узла цели помогло мне исправить «ReferenceError: regeneratorRuntime не определено» в Jest:

{
  "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 .

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

Единственное, что мне нужно было сделать, это определить цель в babel, как упоминалось @AoDev. Никаких дополнительных целей в других местах.

Чтобы глобально импортировать и определить среду выполнения регенератора, выполните следующие действия:

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://github.com/facebook/jest/pull/7595#issuecomment -454486373

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

@ здесь ни одна из попыток здесь не сработала для меня, кажется, я все еще получаю, что набор тестов не запускается

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",
"вавилонская шутка": "^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, плагинах и т. д.
Почему это не может работать из коробки?

обновление В моем случае у меня уже был babel.config.js, но он отсутствовал
targets: { node: 'current' }

Была ли эта страница полезной?
0 / 5 - 0 рейтинги