Jest: Erro no exemplo assíncrono: ReferenceError: regeneratorRuntime não está definido

Criado em 12 mar. 2017  ·  21Comentários  ·  Fonte: facebook/jest

Estou recebendo o seguinte erro ao tentar executar um exemplo deste diretório:
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.

O mesmo problema pode ser reproduzido usando o nó 6.10 e o nó 7.7.4:

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

Comentários muito úteis

Isso funcionou para eu corrigir "ReferenceError: regeneratorRuntime não está definido" no Jest:

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

Então em .babelrc (além de outras opções):

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

Todos 21 comentários

Isso não é reproduzido localmente em nosso CI ou localmente. Talvez haja algo errado com sua versão do npm?

@cpojer

Obrigado Cris.

Esse problema pode ser reproduzido a partir do contêiner do docker executando node:latest do seguinte repositório:
https://hub.docker.com/_/node/

Abaixo estão as etapas que levam a um erro:

# 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

Estou correto na forma como executo este exemplo?
É possível que esteja faltando alguns requisitos globais que farão esse cenário passar?
Posso oferecer-lhe alguma informação adicional?

Editar:
Descobri que o exemplo funciona se você substituir o tempo de execução da regeneração por babel-polyfill em devDependencies.

Vou assumir que jest in master é realmente compatível com o módulo anterior, mas o exemplo não usa código master e, em vez disso, puxa a versão mais recente que ainda pode exigir babel-polyfill.

Estou enfrentando o mesmo problema com o Travis CI: https://travis-ci.org/okonet/lint-staged/jobs/212179781

Testes funcionando bem localmente, mas não no CI

Acabei de me deparar com esse problema!

@mpontus @okonet você pode usar jest@next onde está fixo ou caso contrário você precisa instalar babel-polyfill .

O Jest costumava incluir automaticamente babel-polyfill (e ainda faz isso em 19.0.2), mas como causava vazamentos de memória, passamos a usar apenas regenerator-runtime , que vem com nossos deps transitivos (portanto, já que o Jest v20 se você estiver usando npm >=3 ou yarn, não precisará instalar nada para suporte async/await).

O problema é que erradicamos babel-polyfill dos documentos, mas esquecemos de incluir esta diferença https://github.com/facebook/jest/pull/2755 em 19.0.2 e não lançamos um lançamento decente desde então (apenas jest@next tag).
Desculpe o transtorno!

@thymikee Como posso usar regenerator-runtime conforme descrito nos documentos junto com uma transformação?
Não estou usando nenhum arquivo .babelrc no meu projeto e carrego uma configuração do babel que é compartilhada para a configuração do webpack e do jest, como abaixo:

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)

Desculpe acordar um problema antigo: estou enfrentando o mesmo problema com o Jest 20.0.4, e não posso realmente descobrir a conclusão desses comentários. Pelo que posso ver:

  • A documentação async/await aconselha a usar babel-preset-env , mas o exemplo async/await usa babel-plugin-transform-runtime . Qual é a dependência recomendada?
  • Como okonet , o regeneratorRuntime surge no CircleCI, mas não localmente. Executar meu script de teste de CI localmente com --runInBand não indica que esse é o problema.
  • Parece que a causa raiz é que regenerator-runtime precisa ser instalado diretamente se você estiver usando um gerenciador de pacotes mais antigo, o que, no CI, é provável.

Eu estava enfrentando o mesmo problema, importar o babel-polyfill diretamente para o jest.init.js (arquivo de configuração jest) resolveu o problema para mim.

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

Desculpe a pancada! Mas eu queria compartilhar 😄 . Adicionar isso em meus plugins gerais funciona para mim:

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

Não sei se esta é a melhor maneira de lidar com isso, no entanto.

Isso funcionou para eu corrigir "ReferenceError: regeneratorRuntime não está definido" no Jest:

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

Então em .babelrc (além de outras opções):

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

Eu estava enfrentando o mesmo problema, importar o babel-polyfill diretamente para o jest.init.js (arquivo de configuração jest) resolveu o problema para mim.

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

Eu tentei importar o polyfill em jest.init.js mas ele quebrou meus testes estranhamente. Eu não tive o erro do gerador indefinido, mas tive muitos erros que não tive anteriormente em meus testes, como importações de componentes ausentes ou props ausentes.

Meu jest.conf.js continha a seguinte linha:

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

Daí eu tive que importar o polyfill em setup.js vez de jest.init.js (que não existia):

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

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

_Exceto pela linha de importação polyfill, as outras 3 linhas já estavam no arquivo quando o abri._

Importar o polyfill em setup.js funcionou enquanto importá-lo em jest.init.js não funcionou (mudei o caminho setupFiles).

Adicionar a corrente do nó de destino funcionou para mim para corrigir "ReferenceError: regeneratorRuntime não está definido" no Jest:

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

Adicionar a corrente do nó de destino funcionou para mim para corrigir "ReferenceError: regeneratorRuntime não está definido" no Jest:

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

Na verdade, isso não ajudará no babelyfing, meu código não será compilado com o nó de destino atual. Vai ficar exatamente igual (ES6). Os testes estariam em execução, ótimo, mas nenhum código compilado: P

Aqui está um trecho do meu package.json, isso funciona para mim agora.

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

Para mim, não foi suficiente ter alvos de env predefinidos especificados na configuração comum.
Eu tive que definir os destinos novamente explicitamente para node em 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',
      ]
    }
  }
}

A única coisa que tive que fazer é definir o alvo no babel como mencionado por @AoDev. Nenhum alvo adicional em outro lugar.

Para importar e definir o tempo de execução do regenerador globalmente, você faz:

require('regenerator-runtime/runtime');

Para aqueles que querem apenas adicionar a coisa necessária, e não brincar com a adição de todos os polyfills babel para brincadeira.

Isso foi mencionado na postagem do blog apresentando o Jest 24, se as pessoas perderam: https://jestjs.io/blog/2019/01/25/jest-24-refreshing-polished-typescript-friendly#breaking -changes. Você precisa configurar o babel corretamente, sem necessidade de alterar nenhum código. Veja este comentário do PR: https://github.com/facebook/jest/pull/7595#issuecomment -454486373

@ghengeveld Isso é trabalho para mim, obrigado

O que resolveu para mim foi não apenas adicionar o regenerador, mas também o tempo de execução à minha configuração:

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

@aqui nenhuma das tentativas aqui funcionou para mim, ainda pareço estar recebendo a falha do pacote de testes ao ser executado

ReferenceError: regeneratorRuntime is not defined

Este meu meu pacote.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",
"desintoxicação": "^16.5.1",

.babelrc
sempre que eu adiciono algo neste arquivo, meus arquivos de aplicativo não serão executados. Eu tenho que excluir este arquivo de volta para que meu aplicativo nativo reativo seja executado

Encontrou o mesmo problema. Novo jest (26.6.3), teste assíncrono simples e isso ..
Para um framework que se define como "delicioso", isso realmente não é.
Por que diabos eu preciso me preocupar com a configuração do babel, plugins etc.
Por que não pode funcionar fora da caixa?

atualizado No meu caso, eu já tinha babel.config.js mas estava faltando
targets: { node: 'current' }

Esta página foi útil?
0 / 5 - 0 avaliações