Babel unerwarteter Token-Import beim Ausführen von Mokka-Tests


92

Die Lösungen, die in anderen verwandten Fragen angeboten werden, z. B. das Einfügen der richtigen Voreinstellungen (es2015) in .babelrc, sind bereits in meinem Projekt implementiert.

Ich habe zwei Projekte (nennen wir sie A und B), die beide die ES6-Modulsyntax verwenden. In Projekt A importiere ich Projekt B, das über npm installiert wird und sich im Ordner node_modules befindet. Wenn ich meine Testsuite für Projekt A ausführe, wird folgende Fehlermeldung angezeigt:

SyntaxError: Unerwarteter Token-Import

Dem geht diese angeblich fehlerhafte Codezeile aus Projekt B voraus:

(Funktion (exportiert, erfordert, Modul, __Dateiname, __Dirnname) {importiere createBrowserHistory aus 'history / lib / createBrowserHistory';

Das iife scheint etwas mit npm oder möglicherweise babel zu tun zu haben, da meine Quelldatei nur "import createBrowserHistory from 'history / lib / createBrowserHistory' enthält; Die Komponententests in der Testsuite von Projekt B laufen einwandfrei, und wenn ich Projekt B als Abhängigkeit von entferne Projekt A, meine Testsuite (die immer noch es6-Importe für interne Projektmodule verwendet) funktioniert dann einwandfrei.

Full Stack Trace:

 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

Hier ist mein Testbefehl von package.json:

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

Dieser StackOverflow-Beitrag ist ähnlich, bietet jedoch keine Lösung für meine Verwendung der Befehlszeile: Importieren eines Moduls aus node_modules mit babel, aber fehlgeschlagen


1
Wenn Sie ein Modul auf npm verteilen, sollten Sie nur die transpilierte Version dieses Moduls verteilen.
Loganfsmyth

Dieses Projekt ist sehr leicht. Es ist hauptsächlich für meinen eigenen Gebrauch oder für andere bestimmt, wenn ein Transpirationsprozess vorhanden ist, der dies unterstützen kann. Ich versuche "vanilla es6" in diesen Abhängigkeiten zu erreichen.
ThinkingInBits

2
Ich denke, Sie vergessen, das Babel in package.json zu konfigurieren. füge diese zu deinem package.json "babel" hinzu: {"presets": ["es2015"]}
Jacob

3
Hinweis: Laut Dokumentation --compilers ist dies nicht erforderlich, --require babel-registersollte stattdessen verwendet werden: "Wenn Ihre ES6-Module die Erweiterung .js haben, können Sie --save-dev babel-register npm installieren und mocha --require babel-register; --compiler verwenden ist nur erforderlich, wenn Sie eine Dateierweiterung angeben müssen. "
versuchen-fangen-endlich

1
Endlich konnte ich das zum Laufen bringen, "babel":{"presets": ["es2015"]}es war das Letzte, was mir fehlte!
Brandon

Antworten:


79

Für Babel <6

Der einfachste Weg, um dieses Problem zu lösen, ist:

  1. npm install babel-preset-es2015 --save-dev
  2. In .babelrcan die Wurzel des Projektes mit dem Inhalt:

    {
     "presets": [ "es2015" ]
    }

Stellen Sie sicher, dass Sie Mokka mit dem Parameter "--compilers js: babel-core / register" ausführen.

Für Babel6 / 7 +

  1. npm install @babel/preset-env --save-dev
  2. In .babelrcan die Wurzel des Projektes mit dem Inhalt:

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

Stellen Sie sicher, dass Sie Mokka mit dem Parameter --compilers js:babel-register(Babel 6) oder --compilers js:@babel/register(Babel 7) ausführen

Für Mokka Version 7 oder höher, Verwendung --require babel-registeroder --require @babel/registersind.


27
Versuchen Sie, Mokka mit --require babel-register param
kolec

2
@kolec Das funktioniert. Noch besser ist es, eine mocha.optsDatei im Stammverzeichnis von / test zu erstellen und dort hinzuzufügen
Martin Dawson

3
All dies zusammen hilft immer noch nicht (Befehlszeile, nicht mocha.opts).
Kev

3
Wenn Sie es2016 verwenden möchten, denken Sie daran, dass es2016 in Babel "Kompiliert nur die Inhalte von ES2016 bis ES2015", sodass Sie sowohl es2016 als auch es2015 in Ihrem Presets-Array
benötigen

4
--compilersist jetzt veraltet. Verwenden Sie --requirestattdessen.
Robsch

45

Es scheint, dass die einzige Lösung darin besteht, explizit Folgendes einzuschließen:

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

in einer Testhelferdatei und geben Sie diese in meinem Testbefehl an Mokka weiter:

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

Das finale Resultat:

Add registerBabel.js : Eine separate Datei, deren Aufgabe es ist, babel-core / register zu benötigen ...

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

Fügen Sie eine entry.js hinzu, wenn Ihre Anwendung auch auf babel-node basiert . Dies fungiert als Wrapper für Ihre es6-haltige Anwendung.

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

Sie würden dann Ihre Anwendung mit ausführen node entry

Für Mokka-Tests testHelper.js auch registerBabel.js benötigen, um die Babel-Unterstützung zur Laufzeit zu initialisieren.

require('./registerBabel');

Und führen Sie Ihre Mokka-Tests mit mocha --require ./testHelper.js '+(test)/**/*Spec.js'

Dadurch werden alle Dateien, die mit "Spec.js" in "./test" enden, rekursiv getestet. Ersetzen Sie das Muster durch ein Muster, das den Spezifikationen in Ihrem Projekt entspricht.


3
Es scheint, dass ignoreRegex ein wenig aus ist. Ich musste direkt nach node_modules einen Escape-Backslash hinzufügen: ignore: /node_modules\/(?!ProjectB)/damit die babelRegister-Datei funktioniert. Ansonsten scheint es toll!
Hellatan

Dies erlaubt uns nicht, Rollupify zu verwenden, da die Anweisungen erforderlich sind. Würdest du einen Weg kennen, dies zu tun, ohne die require-Anweisungen zu verwenden?
MikesBarto2002

Das ist großartig, aber was ist mit Tools, die es nicht erlauben, solchen Code hinzuzufügen und Ihre Dateien direkt ausführen möchten. Dann landen Sie bei dem, babel-nodewas so etwas nicht erlaubt .babelrc.
Evgeny

1
du bist großartig! Babel verarbeitete meinen ES6-Code, als er nur den Server ausführte, aber der Mokka-Test schlug fehl. Ihre Antwort hat es gelöst. Ich habe versucht --compiler in mocha.opts, aber das hat dazu geführt, dass die Importanweisungen fehlgeschlagen sind.
Energetische Pixel

1
Ich konnte das nicht zum Laufen bringen, aber es stellte sich heraus, dass ich auch mein babelrc erweitern musste: `` `require ('@ babel / register') ({erweitert: './.babelrc', ignoriere: [/ node_modules \ / (?! ProjectB) /]}); `` `
TiggerToo

26

Sicher, Sie werden dieses Problem haben, Sie verwenden ES6, das Mokka nicht kennt

Sie verwenden also babel, aber Sie verwenden es nicht in Ihrem Test ...

Einige Lösungen:

A. Wenn Sie mit NPM arbeiten, verwenden Sie

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

B. Ich benutze

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

C. Von cli:

mokka --compiler js: babel-core / register test * .js

Weitere Informationen finden Sie unter http://www.pauleveritt.org/articles/pylyglot/es6_imports/.


1
ich danke dir sehr! Mir fehlte die Option --compiler js: babel-core / register
mycargus

1
Ich habe das schon gemacht ... hast du überhaupt die erste Frage gelesen?
ThinkingInBits

1
@ThinkingInBits Was haben Sie letztendlich verwendet, wie haben Sie (wenn Sie dies getan haben) das Problem gelöst? Ich habe ernsthafte Probleme hier, habe die meisten dieser Optionen ausprobiert
Milan Velebit

--compilersist jetzt veraltet, sieht aus wie --requireist die einzige Option sicher zu gehen
Ali Ghanavatian

23

Ich bin auf dasselbe Problem gestoßen. Nachdem ich jede andere Lösung für Stackoverflow und darüber hinaus ausprobiert hatte, tat es diese einfache Konfiguration für package.json für mich:

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

Alle meine ES6-Importe funktionierten danach. Übrigens hatte ich dieselbe Konfiguration in webpack.config.js, aber anscheinend war dies die einzige Möglichkeit, damit es auch für Mokka-Tests funktioniert.

Hoffe das hilft jemandem.


Ich hatte eine .babelrc-Datei falsch geschrieben, so dass es anfangs nicht funktionierte. Diese Lösung funktioniert und ist die empfohlene Lösung. Erstellen Sie eine .babelrc-Datei in Ihrem Projekt und fügen Sie {"presets": ["es2015"]} hinzu
AfDev

14

Ich hatte {"modules": false}in meiner .babelrc-Datei wie folgt:

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

das warf

Unerwarteter Token-Import

Sobald ich es entfernt habe, lief Mokka erfolgreich.


Dies wurde von Webpacker for Rails generiert: `` `" Voreinstellungen ": [[" env ", {" Module ": false," Ziele ": {" Browser ":"> 1% "," uglify ": ​​true}, "useBuiltIns": true}], "react" `` `Nachdem ich die Modulzeile entfernt hatte, funktionierte es für mich.
leere Wände

Dies löste mein Problem, als CircleCI meine Scherz-Unit-Tests nicht ausführen konnte und mir den unerwarteten Fehler beim Token-Import gab. +1!
Candlejack

Das hat es für mich getan. Rails, Webpacker, etc ... Danke!
leere Wände

8

Ich hatte das gleiche Problem und habe es behoben, indem ich aus der Babel-Dokumentation zur Integration von Babel in Mocha gelesen habe :

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

Für welche Version von Mocha und Babel?
Ognyan Dimitrov

Meine Babel-Versionen sind 6.26.0außer "babel-preset-env": "1.6.0"und "mocha": "3.5.3"
Bhantol

Seltsam. Dies löste mein Problem und war in meinem Fall ein reines Read-the-Doc-Problem.
Ognyan Dimitrov

6

Für jeden, der Babel 7 und Mocha 4 verwendet, haben sich einige der Paketnamen etwas geändert und die akzeptierte Antwort ist etwas veraltet. Was ich tun musste war:

npm install @babel/register --saveDev

und Hinzufügen --require @babel/registerzur Testzeile inpackage.json

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

Das @babel/polyfillbehebt einige Dinge wie die asynchrone / warten-Funktionalität, wenn Sie diese verwenden.

Hoffe das hilft jemandem :)


3

--compilers ist veraltet.

Meine einfache Lösung:

npm install --save-dev babel-core

Und in der package.json fügen Sie Ihr Testskript folgendermaßen hinzu:

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

3

Ich füge hier eine weitere ES6 + Mokka + Babel-Konfigurationsantwort hinzu, die ab dem 19. Juni aktuell ist (siehe Daten zu Antwort / Kommentar). Mokka hat die veraltete --compilerFlagge und die Version , dass ich muß mit , dass nicht verfügbar , auch mit --no-deprecationFlagge, vgl diese

Beachten Sie, dass ich nicht alle relevanten Teile der verlinkten Seiten einbinde, da mich keiner von ihnen zu einem sauberen Test-Build gebracht hat, der auf den neuesten Versionen von Mokka und Babel basiert. Diese Antwort sollte die Schritte enthalten, die mich zu einem erfolgreichen Testbuild geführt haben.

Befolgen Sie die Anweisungen hier, in dieser Antwort und hier und versuchen Sie, das scheinbar neueste neueste Babel zu installieren, indem Sie Folgendes verwenden npm install:

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

Und ich habe den Mokka-Aufruf in package.json wie folgt angepasst:

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

Dies führte zu Fehlern:

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

Wie oben, --no-deprecationhat nicht geholfen, bitte verweisen Sie auf die oben verlinkte Seite. Also habe ich die Anweisungen von hier befolgt und package.json angepasst:

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

Und es wurden Fehler beim Auffinden von Babel-Modulen angezeigt, z.

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

Zu diesem Zeitpunkt begann ich mit der Installation von Babel-Paketen, bis ich Fortschritte machen konnte. Ich glaube, dass die vollständige Installation so etwas wie:

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

Die letzte erforderliche Änderung bestand darin, den Mokka-Aufruf in package.json zu aktualisieren und das js:Präfix wie folgt zu entfernen :

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

Ich kann nicht antworten, warum dies notwendig war: Wenn jemand darauf antworten kann, hinterlasse bitte einen Kommentar und ich werde meine Antwort mit besseren Informationen aktualisieren.

Als letztes habe ich im Projektverzeichnis eine .babelrc mit folgendem Inhalt erstellt:

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

Ich kann mich nicht erinnern, was dies veranlasst hat, aber ich glaube, dass es daran lag, dass Mokka sich weiterhin darüber beschwerte, dass das importSchlüsselwort in meiner test.js nicht erkannt wurde. Wie oben, wenn jemand dies beantworten kann, hinterlasse bitte einen Kommentar und ich werde meine Antwort mit besseren Informationen aktualisieren.


Zu diesem Zeitpunkt kann ich meine Mokka-Tests erfolgreich durchführen. Mir ist klar, dass es hier Wissenslücken gibt: Ich habe viel Javascript-Code für die Produktion geschrieben, aber ich bin ein relativer Knoten-Noob. Jeder, der dies mit mehr sieht, um die Antwort zu ergänzen, hinterlasse bitte einen Kommentar und ich werde die Antwort verbessern, ODER hinterlasse deine eigene bessere Antwort.
pb2q

2

Ich fand, dass der einfachste Weg, mit babel 6.XX umzugehen, darin bestand, nyc zu verwenden und dann a hinzuzufügen helper Datei in die Dateipckage.json

Also hier ist was ich benutzt habe

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')();

Jetzt können Sie es6 in Ihren Tests oder überall dort verwenden, wo Sie es benötigen. Meine scheitern alle;)

Dann wird npm run testwas abfeuernnyc mocha --reporter tap 'test/**/*.spec.js'


2

Folgendes hat bei mir funktioniert. Ich habe eine Warnung erhalten, wenn ich die --compilersFlagge benutzt habe.

DeprecationWarning: "--compiler" werden in einer zukünftigen Version von Mocha entfernt. Weitere Informationen finden Sie unter https://git.io/vdcSr

Ich habe es daher durch die --requireFlagge ersetzt

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

Hier ist mein .babelrc:

{
  "presets": ["env"]
}

Meine package.jsonEntwicklerabhängigkeiten

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

2

Ich habe dieses Problem heute Morgen mit den folgenden Anweisungen behoben

Installieren Sie NPM-Module

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

Ich habe dieses Problem heute Morgen mit den folgenden Anweisungen aus den offiziellen Anweisungen zur Verwendung von Babel für Mokka 4 behoben :

Installieren Sie NPM-Module

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

oder ein einzelner Befehl:

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

Ich habe mochagenau den gleichen Fehler installiert und festgestellt, als ich ihn importin meinem Code verwendete. Durch Ausführen der folgenden Aktionen wurde das Problem behoben.

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

Und dann fügen Sie eine .babelrcDatei hinzu:

{
    "presets": [
        "es2015"
    ]
}

Und dann laufen Sie mochaso:

mocha --compilers js:babel-core/register

-1

Ich hatte das gleiche Problem. Beim Ausführen von Tests wurde mir klar, dass ich tatsächlich abhängige Module stubben wollte. Es ist gut für Unit-Tests und verhindert, dass Babel Submodule transformiert. Also habe ich benutzt proxyquire, nämlich:

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

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

Dies passt besser als Kommentar.
Gajus

-3

für eine zukunftssicherere Einstellung

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

und in .babelrc

{
  "presets": [ "latest" ]
}

im Gegensatz zu...

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

und

{
 "presets": [ "es2015" ]
}

2
Ich denke, diese Antwort hat praktisch nichts mit dieser Frage zu tun. Oder besser gesagt, sie könnte als Kommentar zu einer anderen Antwort hinzugefügt werden
62mkv

@ 62mkv Danke! Ein Weg, ein Falke zu sein und diesen Ort sauber zu halten.
Phil Henry Mcboob
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.