Les solutions proposées dans d'autres questions connexes, telles que l'inclusion des préconfigurations appropriées (es2015) dans .babelrc, sont déjà implémentées dans mon projet.
J'ai deux projets (appelons-les A et B) qui utilisent tous les deux la syntaxe du module ES6. Dans le projet A, j'importe le projet B, qui est installé via npm et réside dans le dossier node_modules. Lorsque j'exécute ma suite de tests pour le projet A, le message d'erreur suivant s'affiche:
SyntaxError: Importation de jeton inattendue
Ce 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 à partir de 'history/lib/createBrowserHistory';
La vie semble être quelque chose de lié à npm ou probablement babel puisque mon fichier source ne contient que "import createBrowserHistory à partir de" history/lib/createBrowserHistory "; Le projet A, ma suite de tests alors (utilisant toujours les importations es6 pour les modules de projet internes) fonctionne parfaitement.
Trace de pile complète:
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'"
Cet article de 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 échoué
Il semble que la seule solution consiste à inclure explicitement:
require('babel-core/register')({
ignore: /node_modules/(?!ProjectB)/
});
dans un fichier d'aide au test, et transmettez-le à mocha dans ma commande de test:
mocha --require ./test/testHelper.js...
La solution finale:
AjouterregisterBabel.js: un fichier séparé dont le travail est d'exiger babel-core/register ...
require('babel-core/register')({
ignore: /node_modules/(?!ProjectB)/
});
Ajoutez unentry.jssi votre application s'appuie é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 ensuite votre application avec node entry
Pour les tests de moka,testHelper.jsdevrait également avoir besoin de registerBabel.js pour initialiser le support Babel au moment de l'exécution.
require('./registerBabel');
Et lancez vos tests moka avec mocha --require ./testHelper.js '+(test)/**/*Spec.js'
Ceci testera récursivement tout fichier se terminant par "Spec.js" dans "./test". Remplacez le motif par un modèle correspondant aux spécifications de votre projet.
Le moyen le plus simple de résoudre ce problème est:
npm install babel-preset-es2015 --save-dev
Ajoutez .babelrc
à la racine du projet avec le contenu:
{
"presets": [ "es2015" ]
}
Assurez-vous d’exécuter mocha avec le paramètre "--compilers js: babel-core/register".
npm install @babel/preset-env --save-dev
Ajoutez .babelrc
à la racine du projet avec le contenu:
{
"presets": [ "@babel/preset-env" ]
}
Assurez-vous que vous utilisez mocha avec le paramètre --compilers js:babel-register
(Babel 6) ou --compilers js:@babel/register
(Babel 7).
Bien sûr, vous aurez ce problème, vous utilisez ES6 que le 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: test de babel-core/register * .js
Vous pouvez en lire plus à http://www.pauleveritt.org/articles/pylyglot/es6_imports/
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é par la suite… .. Au fait, j'avais la même configuration dans webpack.config.js, mais apparemment, c'était le seul moyen de le faire fonctionner également pour les tests de moka.
J'espère que ça aide quelqu'un.
J'ai eu {"modules": false}
dans mon fichier .babelrc, comme ceci:
"presets": [
["es2015", {"modules": false}],
"stage-2",
"react"
]
qui jetait
Importation de jeton inattendue
Une fois que je l'ai enlevé, Mocha a fonctionné avec succès.
J'ai eu le même problème et je l'ai corrigé en lisant la documentation babel pour intégrer Babel à Mocha:
{
"scripts": {
"test": "mocha --compilers js:babel-register"
}
}
Pour tous ceux qui utilisent Babel 7 et Mocha 4, certains noms de paquets ont légèrement changé et la réponse acceptée est un peu obsolète. Ce que je devais faire était:
npm install @babel/register --saveDev
et en ajoutant --require @babel/register
à la ligne de test dans package.json
"test": "./node_modules/mocha/bin/mocha --require @babel/polyfill --require @babel/register './test/**/*.spec.js'"
Le @babel/polyfill
corrige des problèmes tels que la fonctionnalité async/wait si vous les utilisez.
J'espère que ça aide quelqu'un :)
J'ai trouvé que le moyen le plus simple de faire avec babel 6.X.X était d'utiliser nyc puis d'ajouter un fichier helper
dans le pckage.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 maintenant utiliser es6 dans vos tests ou partout où vous en aurez besoin. Les miens échouent tous;)
Puis npm run test
qui se déclenchera nyc mocha --reporter tap 'test/**/*.spec.js'
--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"
},
Voici ce qui a fonctionné pour moi. J'ai reçu un avertissement lors de l'utilisation du drapeau --compilers
.
DeprecationWarning: "--compilers" sera supprimé dans une version ultérieure de moka; voir https://git.io/vdcSr pour plus d'informations
Je l'ai donc remplacé par le drapeau --require
"test": "mocha --require babel-core/register --recursive"
Voici mon .babelrc
:
{
"presets": ["env"]
}
Mes dépendances package.json
dev
"devDependencies": {
"babel-cli": "^6.26.0",
"babel-preset-env": "^1.7.0",
"mocha": "^5.2.0",
}
Vous devrez peut-être spécifier l'option extensions
si vous utilisez TypeScript:
require("@babel/register")({
extensions: ['.jsx', '.js', '.ts', '.tsx']
})
J'ajoute une autre réponse de configuration ES6 + moka + babel ici, en date du 19 juin (se référer aux dates sur réponse/commentaire). mocha a déconseillé le drapeau --compiler
, et la version que j'utilise a été indisponible, même avec le drapeau --no-deprecation
, c.f. ceci
Notez que je n'inclurai pas tous les éléments pertinents des pages liées, car aucun d'entre eux ne m'a amené à une version de test propre basée sur les dernières versions de mocha et babel; cette réponse devrait inclure les étapes qui m'ont conduit à une construction de test réussie.
En suivant les instructions ici, et dans cette réponse , et ici , j'ai essayé d'installer ce qui semblait être le dernier babel minimum 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 faire référence à la page liée ci-dessus. Donc, en suivant les instructions de ici j'ai ajusté package.json:
"scripts": {
"test": "mocha --require js:@babel/register"
}
Et commencé à voir des erreurs sur la localisation des modules babel, tels que:
× ERROR: Cannot find module '@babel/register'
À ce stade, j'ai commencé à installer des paquets babel jusqu'à ce que je puisse progresser. Je crois que l'installation complète ressemble à quelque chose comme:
$ npm install --save-dev @babel/preset-env @babel/register @babel/core
La dernière modification requise consistait à mettre à jour l'appel mocha dans package.json, en supprimant le préfixe js:
, comme suit:
"scripts": {
"test": "mocha --require @babel/register"
}
Je ne peux pas dire pourquoi c'était nécessaire: si quelqu'un peut répondre, laissez un commentaire et je mettrai à jour ma réponse avec une meilleure information.
La dernière chose que j'ai faite a été de créer un fichier .babelrc dans le répertoire du projet, avec le contenu suivant:
{
"presets" : ["@babel/preset-env"]
}
Je ne me souviens pas de ce qui a motivé cela, mais je crois que c’est parce que mocha a continué de se plaindre de ne pas reconnaître le mot clé import
dans mon test.js. Comme ci-dessus, si quelqu'un peut répondre à cette question, veuillez laisser un commentaire et je mettrai à jour ma réponse avec une meilleure information.
J'ai installé mocha
et j'ai rencontré exactement la même erreur lorsque j'utilise import
dans 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 ajoutez ensuite un fichier .babelrc
:
{
"presets": [
"es2015"
]
}
Et lancez mocha
de cette façon:
mocha --compilers js:babel-core/register
J'ai résolu ce problème ce matin avec les instructions suivantes fournies par les instructions officielles de 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"]
}
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"]
}