Jest: خطأ في مثال غير متزامن: ReferenceError: regeneratorRuntime غير محدد

تم إنشاؤها على ١٢ مارس ٢٠١٧  ·  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؟

تضمين التغريدة

شكرا كريس.

يمكن تكرار هذه المشكلة من عقدة تشغيل حاوية عامل الإرساء
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

هل أنا محق في طريقة تنفيذ هذا المثال؟
هل من الممكن أن أفتقد بعض المتطلبات العالمية التي ستجعل هذا السيناريو يمر؟
هل يمكنني أن أقدم لك أي معلومات إضافية؟

تعديل:
لقد وجدت أن هذا المثال يعمل إذا استبدلت regeneration-runtime بـ babel-polyfill في devDependencies.

سأفترض أن jest in master متوافق بالفعل مع الوحدة السابقة ، لكن المثال لا يستخدم رمزًا رئيسيًا وبدلاً من ذلك يسحب أحدث إصدار والذي قد لا يزال يتطلب babel-polyfill.

أواجه نفس المشكلة مع Travis CI: https://travis-ci.org/okonet/lint-staged/jobs/212179781

تعمل الاختبارات بشكل جيد محليًا ولكن ليس على CI

لقد اصطدمت للتو بهذه القضية!

mpontusokonet يمكنك استخدام jest@next حيث انها ثابتة أو غير ذلك، تحتاج إلى تثبيت babel-polyfill .

اعتاد Jest على تضمين babel-polyfill تلقائيًا (ولا يزال يفعل ذلك في 19.0.2) ، ولكن نظرًا لأنه تسبب في تسرب الذاكرة ، انتقلنا إلى استخدام regenerator-runtime فقط ، والذي يتم شحنه مع مستودعاتنا المتعدية (لذلك منذ Jest v20 إذا كنت تستخدم npm> = 3 أو الغزل ، فلن تحتاج إلى تثبيت أي شيء من أجل الدعم غير المتزامن / انتظار).

تكمن المشكلة في أننا استأصلنا babel-polyfill من المستندات ، لكننا نسيت تضمين هذا الفرق https://github.com/facebook/jest/pull/2755 في 19.0.2 ولم نطرح إصدار لائق منذ ذلك الحين (فقط jest@next tag).
آسف على الإزعاج!

thymikee كيف يمكنني استخدام regenerator-runtime كما هو موضح في المستندات مع التحويل؟
أنا لا أستخدم أي ملف .babelrc في مشروعي وقم بتحميل تكوين babel الذي تمت مشاركته لكل من webpack و jest التكوين تمامًا كما هو موضح أدناه:

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)

آسف لاستيقاظ مشكلة قديمة: أنا أواجه نفس المشكلة مع Jest 20.0.4 ، ولا يمكنني فعلاً التخلص من هذه التعليقات. مما يمكنني رؤيته:

  • ينصح التوثيق غير المتزامن / انتظار باستخدام babel-preset-env ، لكن المثال غير
  • مثل okonet ، يظهر برنامج regeneratorRuntime في CircleCI ولكن ليس محليًا. لا يشير تشغيل البرنامج النصي لاختبار CI محليًا باستخدام --runInBand إلى أن هذه هي المشكلة.
  • يبدو أن السبب الأساسي هو أن regenerator-runtime يحتاج إلى التثبيت مباشرة إذا كنت تستخدم مدير حزم أقدم ، وهو أمر محتمل في CI.

كنت أواجه نفس المشكلة ، فقد أدى استيراد babel-polyfill مباشرة إلى jest.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
      }
    ]

لا أعرف ما إذا كانت هذه هي أفضل طريقة للتعامل معها أم لا.

نجح هذا في إصلاح "ReferenceError: regeneratorRuntime غير محدد" في Jest:

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

ثم في .babelrc (إلى جانب الخيارات الأخرى):

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

كنت أواجه نفس المشكلة ، فقد أدى استيراد babel-polyfill مباشرة إلى jest.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';

حاولت استيراد polyfill بـ jest.init.js لكنه كسر اختباراتي بشكل غريب. لم يكن لدي خطأ المولد غير المحدد ولكن كان لدي الكثير من الأخطاء التي لم أواجهها من قبل في اختباراتي ، مثل عمليات استيراد المكونات المفقودة أو الدعائم المفقودة.

احتوى jest.conf.js على السطر التالي:

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

ومن ثم اضطررت إلى استيراد polyfill setup.js بدلاً من jest.init.js (وهو ما لم يكن موجودًا):

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

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

_باستثناء سطر استيراد polyfill ، كانت الأسطر الثلاثة الأخرى موجودة بالفعل في الملف عندما فتحته.

لقد نجح استيراد polyfill 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"
        }
      }
    ]
  ]
}

هذا لن يساعد في الواقع ، لن يتم تجميع الكود الخاص بي مع تيار العقدة الهدف. سيبدو بالضبط هو نفسه (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"
          ]
        }
      ]
    ]
  },

بالنسبة لي ، لم يكن كافيًا أن يكون لديك أهداف بيئية محددة مسبقًا في التكوين المشترك.
اضطررت إلى تحديد الأهداف مرة أخرى بشكل صريح لـ 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',
      ]
    }
  }
}

الشيء الوحيد الذي كان علي فعله هو تحديد الهدف في بابل كما ذكرAoDev. لا أهداف إضافية في مكان آخر.

لاستيراد وتعريف وقت تشغيل المُعادِل بشكل عام ، عليك القيام بما يلي:

require('regenerator-runtime/runtime');

لأولئك الذين يريدون فقط إضافة الشيء المطلوب ، وعدم العبث بإضافة جميع polyfills babel من أجل الدعابة.

تم ذكر هذا في منشور المدونة الذي يقدم Jest 24 ، إذا فاته الناس: https://jestjs.io/blog/2019/01/25/jest-24-refreshing-polished-typescript-fri friendly#breaking -changes. تحتاج إلى تكوين بابل بشكل صحيح ، لا حاجة لتغيير أي كود. انظر هذا التعليق من العلاقات العامة: 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

هذه مجموعتي. json
"devDependencies": {
"@ babel / core": "^ 7.6.2"،
"@ babel / plugin-transform-regenerator": "^ 7.8.7"،
"@ babel / وقت التشغيل": "^ 7.9.6"،
"@ response-native-community / eslint-config": "^ 0.0.5"،
"babel-eslint": "^ 10.0.1"،
"babel-jest": "^ 24.9.0"،
"babel-plugin-module-solutionver": "^ 3.1.3"،
"babel-plugin-transform-runtime": "^ 6.23.0"،
"detox": "^ 16.5.1"،

.babelrc
كلما أضفت شيئًا ما على هذا الملف ، لن يتم تشغيل ملفات تطبيقي. لا بد لي من حذف هذا الملف مرة أخرى لتشغيل تطبيقي الأصلي التفاعلي

واجهت نفس المشكلة. جديد jest (26.6.3) ، اختبار غير متزامن عادي وهذا ..
بالنسبة للإطار الذي يعرّف نفسه بأنه "ممتع" ، فهذا ليس كذلك حقًا.
لماذا على الأرض أحتاج إلى الاهتمام بتكوين babel والمكونات الإضافية وما إلى ذلك.
لماذا لا تعمل خارج الصندوق؟

تحديث. في حالتي ، كان لدي babel.config.js بالفعل ولكنه مفقود
targets: { node: 'current' }

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات