Importation inattendue de jetons Babel lors de l'exécution de tests moka


92

Les solutions proposées dans d'autres questions connexes, telles que l'inclusion des préréglages appropriés (es2015) dans .babelrc, sont déjà implémentées dans mon projet.

J'ai deux projets (appelons-les A et B) qui utilisent tous deux la syntaxe du module ES6. Dans le projet A, j'importe le projet B qui est installé via npm et se trouve dans le dossier node_modules. Lorsque j'exécute ma suite de tests pour le projet A, j'obtiens l'erreur:

SyntaxError: importation de jeton inattendue

Qui est précédé de cette prétendue ligne de code erronée du projet B:

(function (exports, require, module, __filename, __dirname) {import createBrowserHistory de 'history / lib / createBrowserHistory';

L'iife semble être quelque chose de npm ou peut-être lié à babel puisque mon fichier source contient uniquement "import createBrowserHistory de 'history / lib / createBrowserHistory'; Les tests unitaires de la suite de tests du projet B fonctionnent correctement, et si je supprime le projet B en tant que dépendance de Projet A, ma suite de tests (utilisant toujours les importations es6 pour les modules de projet internes) fonctionne très bien.

Trace complète de la pile:

 SyntaxError: Unexpected token import
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:374:25)
    at Module._extensions..js (module.js:405:10)
    at Object.require.extensions.(anonymous function) [as .js] (/ProjectA/node_modules/babel-register/lib/node.js:138:7)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Module.require (module.js:354:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (actionCreators.js:4:17)
    at Module._compile (module.js:398:26)
    at loader (/ProjectA/node_modules/babel-register/lib/node.js:130:5)
    at Object.require.extensions.(anonymous function) [as .js] (/ProjectA/node_modules/babel-register/lib/node.js:140:7)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Module.require (module.js:354:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/ProjectA/src/components/core/wrapper/wrapper.js:28:23)
    at Module._compile (module.js:398:26)
    at loader (/ProjectA/node_modules/babel-register/lib/node.js:130:5)
    at Object.require.extensions.(anonymous function) [as .js] (/ProjectA/node_modules/babel-register/lib/node.js:140:7)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Module.require (module.js:354:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/ProjectA/src/components/core/wrapper/wrapperSpec.js:15:16)
    at Module._compile (module.js:398:26)
    at loader (/ProjectA/node_modules/babel-register/lib/node.js:130:5)
    at Object.require.extensions.(anonymous function) [as .js] (/ProjectA/node_modules/babel-register/lib/node.js:140:7)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Module.require (module.js:354:17)
    at require (internal/module.js:12:17)
    at /ProjectA/node_modules/mocha/lib/mocha.js:219:27
    at Array.forEach (native)
    at Mocha.loadFiles (/ProjectA/node_modules/mocha/lib/mocha.js:216:14)
    at Mocha.run (/ProjectA/node_modules/mocha/lib/mocha.js:468:10)
    at Object.<anonymous> (/ProjectA/node_modules/mocha/bin/_mocha:403:18)
    at Module._compile (module.js:398:26)
    at Object.Module._extensions..js (module.js:405:10)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Function.Module.runMain (module.js:430:10)
    at startup (node.js:141:18)
    at node.js:980:3

Voici ma commande de test de package.json:

"test": "mocha --compilers js:babel-core/register '+(test|src)/**/*Spec.js'"

Ce post StackOverflow est similaire mais n'offre pas de solution pour mon utilisation de la ligne de commande: importer un module de node_modules avec babel mais a échoué


1
Si vous distribuez un module sur npm, vous ne devriez distribuer que la version transpilée de ce module.
loganfsmyth

Ce projet est très léger. Il est principalement destiné à mon propre usage, ou à d'autres s'ils ont un processus de transpiration en place qui peut le soutenir. J'essaye de réaliser "vanilla es6" dans ces dépendances.
ThinkingInBits

2
Je pense que vous oubliez de configurer le babel dans package.json. ajoutez-les à votre package.json "babel": {"presets": ["es2015"]}
Jacob

3
Remarque: selon la documentation --compilers n'est pas nécessaire, --require babel-registerdoit être utilisé à la place: "Si vos modules ES6 ont l'extension .js, vous pouvez npm installer --save-dev babel-register et utiliser mocha --require babel-register; --compilers n'est nécessaire que si vous devez spécifier une extension de fichier. "
try-catch-finally

1
Enfin, j'ai pu faire fonctionner cela en utilisant "babel":{"presets": ["es2015"]}c'était la dernière chose qui me manquait!
Brandon

Réponses:


79

Pour Babel <6

Le moyen le plus simple de résoudre ce problème est:

  1. npm install babel-preset-es2015 --save-dev
  2. Ajoutez .babelrcà la racine du projet avec le contenu:

    {
     "presets": [ "es2015" ]
    }

Assurez-vous que vous exécutez mocha avec le paramètre "--compilers js: babel-core / register".

Pour Babel6 / 7 +

  1. npm install @babel/preset-env --save-dev
  2. Ajoutez .babelrcà la racine du projet avec le contenu:

    {
     "presets": [ "@babel/preset-env" ]
    }

Assurez-vous que vous exécutez mocha avec le paramètre --compilers js:babel-register(Babel 6) ou --compilers js:@babel/register(Babel 7)

Pour la version 7 ou ultérieure de mocha, utilisez respectivement --require babel-registerou --require @babel/register.


27
essayez d'exécuter moka avec --require babel-register param
kolec

2
@kolec Cela fonctionne. Encore mieux, créez un mocha.optsfichier à la racine du répertoire / test et ajoutez-le ici
Martin Dawson

3
Tout cela ensemble n'aide toujours pas (ligne de commande, pas mocha.opts).
Kev

3
Si vous voulez utiliser es2016, gardez à l'esprit que es2016 dans Babel "ne compile que ce qui est dans ES2016 à ES2015", donc vous avez besoin à la fois de es2016 et es2015 dans votre tableau de préréglages
prauchfuss

4
--compilersest désormais obsolète. Utilisation--require plutôt.
robsch

46

Il semble que la seule solution soit d'inclure explicitement:

require('babel-core/register')({
  ignore: /node_modules/(?!ProjectB)/
}); 

dans un fichier d'assistance de test, et transmettez-le à mocha dans ma commande de test:

mocha --require ./test/testHelper.js...

La solution finale:

Ajouter registerBabel.js : un fichier séparé dont le travail est de demander babel-core / register ...

require('babel-core/register')({
  ignore: /node_modules/(?!ProjectB)/
});

Ajoutez un fichier entry.js si votre application repose également sur babel-node. Cela agit comme un wrapper pour votre application contenant es6.

require('./registerBabel');
require('./server'); // this file has some es6 imports

Vous exécuteriez alors votre application avec node entry

Pour les tests mocha , testHelper.js devrait également exiger registerBabel.js pour initialiser le support babel au moment de l'exécution.

require('./registerBabel');

Et exécutez vos tests de moka avec mocha --require ./testHelper.js '+(test)/**/*Spec.js'

Cela testera récursivement tout fichier se terminant par "Spec.js" dans "./test". Remplacez le modèle par un correspondant aux spécifications de votre projet.


3
Il semble que l' ignoreexpression régulière soit un peu décalée. J'ai dû ajouter une barre oblique inverse d'échappement juste après node_modules: ignore: /node_modules\/(?!ProjectB)/pour que le fichier babelRegister fonctionne. Sinon, ça a l'air génial!
hellatan

Cela ne nous permet pas d'utiliser Rollupify en raison des instructions require. Connaissez-vous un moyen de le faire sans utiliser les instructions require?
MikesBarto2002

C'est génial, mais qu'en est-il des outils qui ne permettent pas d'ajouter du code comme celui-ci et qui veulent exécuter vos fichiers directement. Ensuite, vous vous retrouvez avec babel-nodequi ne permet pas une telle chose en utilisant .babelrc.
Evgeny

1
votre génial! Babel traitait mon code ES6 en exécutant simplement le serveur, mais les tests mocha échouaient. Votre réponse l'a résolu. J'ai essayé --compilers dans mocha.opts mais cela a provoqué l'échec des instructions d'importation.
Energetic Pixels

1
Je n'ai pas pu faire fonctionner cela, mais il s'est avéré que j'avais également besoin d'étendre mon babelrc: `` `` require ('@ babel / register') ({extend: './.babelrc', ignore: [/ node_modules \ / (?! ProjectB) /]}); ``
TiggerToo

26

Bien sûr que vous aurez ce problème, vous utilisez ES6 que moka ne sait pas

Donc vous utilisez babel mais vous ne l'utilisez pas dans votre test ...

Peu de solutions:

A. si vous utilisez NPM, utilisez

"test": "mocha --compilers js:babel-core/register test*.js"

B. J'utilise

"test": "./node_modules/.bin/mocha --compilers js:babel-core/register **/*spec.jsx"

C. De cli:

mocha --compilers js: babel-core / register test * .js

Vous pouvez en savoir plus sur http://www.pauleveritt.org/articles/pylyglot/es6_imports/


1
Merci beaucoup! Il me manquait l'option --compilers js: babel-core / register
mycargus

1
Je faisais déjà cela ... avez-vous même lu la question initiale?
ThinkingInBits

1
@ThinkingInBits Qu'avez-vous fini par utiliser, comment avez-vous (si vous l'avez fait) résolu le problème? J'ai de graves problèmes ici, j'ai essayé la plupart de ces options
Milan Velebit

--compilersest obsolète maintenant, on dirait que --requirec'est la seule option sûre à utiliser
Ali Ghanavatian

23

J'ai rencontré le même problème. Après avoir essayé toutes les autres solutions sur stackoverflow et au-delà, l'ajout de cette configuration simple sur package.json l'a fait pour moi:

  "babel": {
    "presets": [
      "es2015"
    ]
  }

Toutes mes importations ES6 ont fonctionné après cela. Au fait, j'avais cette même configuration dans webpack.config.js, mais apparemment, c'était le seul moyen de le faire fonctionner également pour les tests moka.

J'espère que cela aide quelqu'un.


J'avais un fichier .babelrc mal orthographié, donc cela ne fonctionnait pas au départ. Cette solution fonctionne et est la solution recommandée. Créez un fichier .babelrc dans votre projet et ajoutez des {"presets": ["es2015"]}
AfDev

14

J'avais {"modules": false}dans mon fichier .babelrc, comme ceci:

"presets": [
    ["es2015", {"modules": false}],
    "stage-2",
    "react"
]

qui jetait

Importation de jetons inattendue

Une fois que je l'ai retiré, moka a fonctionné avec succès.


Ceci a été généré par Webpacker for Rails: `` `` "presets": [["env", {"modules": false, "cibles": {"browser": "> 1%", "uglify": true}, "useBuiltIns": true}], "react" `` `` Une fois que j'ai supprimé la ligne de modules, cela a fonctionné pour moi.
emptywalls

Cela a résolu mon problème lorsque CircleCI ne parvenait pas à exécuter mes tests unitaires de plaisanterie et me donnait l'erreur d'importation de jeton inattendue. +1!
Candlejack

Cela l'a fait pour moi. Rails, Webpacker, etc ... Merci!
emptywalls

8

J'ai eu le même problème et je l'ai résolu en lisant la documentation babel pour l'intégration de Babel avec Mocha:

{
  "scripts": {
    "test": "mocha --compilers js:babel-register"
  }
}

Pour quelle version de Mocha et Babel?
Ognyan Dimitrov

Mes versions Babel sont 6.26.0sauf "babel-preset-env": "1.6.0"et "mocha": "3.5.3"
bhantol

Étrange. Cela a résolu mon problème et était un pur problème de lecture de la documentation dans mon cas.
Ognyan Dimitrov

6

Pour quiconque utilise Babel 7 et Mocha 4, certains des noms de packages ont un peu changé et la réponse acceptée est un peu dépassée. Ce que j'avais à faire était:

npm install @babel/register --saveDev

et en ajoutant --require @babel/registerà la ligne de test danspackage.json

"test": "./node_modules/mocha/bin/mocha --require @babel/polyfill --require @babel/register './test/**/*.spec.js'"

Le @babel/polyfillcorrige certaines choses comme la fonctionnalité async / wait si vous les utilisez.

J'espère que cela aide quelqu'un :)


3

--compilers est obsolète.

Ma solution simple:

npm install --save-dev babel-core

Et dans le package.json, ajoutez votre script de test comme ceci:

  "scripts": {
    "test": "mocha --require babel-core/register ./test/**/*.js -r ./test-setup.js"
  },

3

J'ajoute ici une autre réponse de configuration ES6 + mocha + babel, à jour en juin 19 (reportez-vous aux dates sur answer / commente). mocha a déprécié le --compilerdrapeau, et la version que j'utilise l'a indisponible même avec le --no-deprecationdrapeau, cf this

Notez que je n'inclurai pas tous les bits pertinents des pages liées, car aucun d'entre eux ne m'a conduit à une version de test propre basée sur les dernières versions de mocha et babel; cette réponse doit inclure les étapes qui m'ont permis de réussir la version de test.

En suivant les instructions ici, et dans cette réponse , et ici , j'ai essayé d'installer ce qui semblait être la dernière version minimale de babel en utilisant npm install:

$ npm install --save-dev mocha
$ npm install --save-dev @babel/preset-env

Et j'ai ajusté l'invocation de moka dans package.json, comme ceci:

"scripts": {
    "test": "mocha --compilers js:@babel/register"
}

Cela a conduit à des erreurs:

× ERROR: --compilers is DEPRECATED and no longer supported.

Comme ci-dessus, --no-deprecation n'a pas aidé, veuillez vous référer à la page liée ci-dessus. Donc, en suivant les instructions d' ici, j'ai ajusté package.json:

"scripts": {
    "test": "mocha --require js:@babel/register"
}

Et j'ai commencé à voir des erreurs sur la localisation des modules babel, telles que:

× ERROR: Cannot find module '@babel/register'

À ce stade, j'ai commencé à installer les paquets babel jusqu'à ce que je puisse progresser. Je pense que l'installation complète est quelque chose comme:

$ npm install --save-dev @babel/preset-env @babel/register @babel/core

La dernière modification requise a été de mettre à jour l'invocation mocha dans package.json, en supprimant le js: préfixe, comme ceci:

"scripts": {
    "test": "mocha --require @babel/register"
}

Je ne peux pas répondre pourquoi cela était nécessaire: si quelqu'un peut répondre à cela, veuillez laisser un commentaire et je mettrai à jour ma réponse avec de meilleures informations.

La dernière chose que j'ai faite a été de créer un .babelrc dans le répertoire du projet, avec le contenu:

{
    "presets" : ["@babel/preset-env"]
}

Je ne me souviens pas de ce qui a provoqué cela, mais je pense que c'est parce que mocha a continué à se plaindre de ne pas reconnaître le importmot - clé dans mon test.js. Comme ci-dessus, si quelqu'un peut répondre à cela, veuillez laisser un commentaire et je mettrai à jour ma réponse avec de meilleures informations.


À ce stade, je peux exécuter mes tests moka avec succès. Je me rends compte qu'il y a des lacunes dans mes connaissances ici: j'ai écrit beaucoup de code javascript de production mais je suis un noob de nœud relatif. Quiconque voit cela avec plus à ajouter à la réponse, veuillez laisser un commentaire et j'améliorerai la réponse, OU laisser votre propre meilleure réponse.
pb2q

2

J'ai trouvé que le moyen le plus simple de faire avec babel 6.XX était d'utiliser nyc, puis d'ajouter un helperfichier dans lepckage.json

Alors voici ce que j'ai utilisé

package.json

{
  ....
  "scripts": {
    "test": "nyc mocha --reporter tap 'test/**/*.spec.js'"
  },
  "devDependencies": {
    "babel-cli": "^6.24.0",
    "babel-core": "^6.24.0",
    "babel-loader": "^6.4.0",
    "babel-preset-env": "^1.2.2",
    "babel-preset-es2015": "^6.24.0",
    "babel-preset-react": "^6.23.0",
    "babel-preset-react-hmre": "^1.1.1",
    "babel-preset-stage-2": "^6.22.0",
    "babel-register": "^6.24.0",
    "babel-runtime": "^6.23.0",
    "chai": "^3.5.0",
    "mocha": "^3.2.0",
    "nyc": "^10.1.2",
    "webpack": "^2.3.3",
    "webpack-config": "^7.0.0",
    "webpack-dashboard": "^0.3.0",
    "webpack-dev-server": "^2.4.2"
  },
  "nyc": {
    "all": true,
    "include": [
      "src/**/*.js"
    ],
    "cache": true,
    "require": [
      "./test/helper/registerBabel.js"
    ]
  }
}

babelrc

{
  "presets": [
    "es2015", //remove the {modules: false} it doesn't work with this
    "stage-2"
  ]
}

registerBabel.js

/* eslint-disable import/no-commonjs, import/unambiguous */
require('babel-register')();

Vous pourrez désormais utiliser es6 dans vos tests ou partout où vous en avez besoin. Les miens échouent tous;)

Alors npm run testqui se déclencheranyc mocha --reporter tap 'test/**/*.spec.js'


2

Voici ce qui a fonctionné pour moi. J'ai reçu un avertissement lors de l'utilisation du --compilersdrapeau.

DeprecationWarning: "--compilers" sera supprimé dans une future version de Mocha; voir https://git.io/vdcSr pour plus d'informations

Je l'ai donc remplacé par le --requiredrapeau

"test":  "mocha --require babel-core/register --recursive"

Voici mon .babelrc:

{
  "presets": ["env"]
}

Mes package.jsondépendances de développement

"devDependencies": {
  "babel-cli": "^6.26.0",
  "babel-preset-env": "^1.7.0",
  "mocha": "^5.2.0",
}

2

J'ai résolu ce problème ce matin avec les instructions suivantes

Installer les modules NPM

npm install --save-dev @babel/polyfill
npm install --save-dev @babel/register

package.json :

"scripts": {
    "test": "mocha --require @babel/register --require @babel/polyfill src/DesktopApplication/Tests",
  }

.babelrc

{
  "presets": ["@babel/env"]
}

1

J'ai résolu ce problème ce matin avec les instructions suivantes des instructions officielles d'utilisation de Babel pour Mocha 4:

Installer les modules NPM

npm install --save-dev babel-polyfill
npm install --save-dev babel-preset-env
npm install --save-dev babel-register

ou une seule commande:

npm i -d babel-polyfill babel-preset-env babel-register

package.json :

"scripts": {
    "test": "mocha --require babel-polyfill --require babel-register"
  }

.babelrc

{
  "presets": ["env"]
}


0

J'ai installé mochaet rencontré exactement la même erreur lorsque j'utilise importdans mon code. En effectuant les actions suivantes, le problème a été résolu.

npm install babel-core --save-dev
npm install babel-preset-es2015 --save-dev
npm install babel-preset-stage-0 --save-dev

Et puis ajoutez un .babelrcfichier:

{
    "presets": [
        "es2015"
    ]
}

Et puis exécutez mochade cette façon:

mocha --compilers js:babel-core/register

-1

J'ai eu le même problème. Lors de l'exécution de tests, j'ai réalisé que je voulais en fait stub des modules dépendants. C'est bon pour les tests unitaires et empêche babel de transformer les sous-modules. J'ai donc utilisé proxyquire, à savoir:

const proxyquire = require('proxyquire').noCallThru()

const myTestedModule = proxyquire('../myTestedModule', {
    'dependentModule1': { //stubbed module1 },
    'dependentModule2': { //stubbed module2 }
})

Cela convient mieux comme commentaire.
Gajus

-3

pour un cadre plus évolutif

npm install babel-preset-latest --save-dev

et dans .babelrc

{
  "presets": [ "latest" ]
}

par opposition à ...

npm install babel-preset-es2015 --save-dev

et

{
 "presets": [ "es2015" ]
}

2
Je suppose que cette réponse n'est pratiquement pas liée à cette question ... ou plutôt, elle pourrait être ajoutée comme commentaire à une autre réponse
62mkv

@ 62mkv Merci! Façon d'être un faucon et de garder cet endroit propre.
Phil Henry Mcboob
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.