モカテスト実行時のバベルの予期しないトークンのインポート


92

.babelrcに適切なプリセット(es2015)を含めるなど、他の関連する質問で提供されるソリューションは、すでに私のプロジェクトに実装されています。

ES6モジュールの構文を使用する2つのプロジェクト(AとBと呼ぶことにします)があります。プロジェクトAでは、npmを介してインストールされ、node_modulesフォルダーにあるプロジェクトBをインポートしています。プロジェクトAのテストスイートを実行すると、エラーが発生します。

SyntaxError:予期しないトークンのインポート

これの前に、プロジェクトBからのこの誤ったコード行が申し立てられています。

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

ソースファイルに「create createBrowserHistory from 'history / lib / createBrowserHistory」のみが含まれているため、iifeはnpmに関連している可能性があります。または、プロジェクトBの依存関係としてプロジェクトBを削除すると、プロジェクトBのテストスイートのユニットテストは正常に実行されます。プロジェクトA、私のテストスイート(内部プロジェクトモジュールに引き続きes6インポートを使用)は問題なく動作します。

完全なスタックトレース:

 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

これがpackage.jsonからの私のテストコマンドです:

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

このStackOverflowの投稿は似ていますが、コマンドラインを使用するためのソリューションを提供していません 。babelを使用してnode_modulesからモジュールをインポートしましたが、失敗しました


1
npmでモジュールを配布する場合は、そのモジュールの変換されたバージョンのみを配布する必要があります。
loganfsmyth 2016年

このプロジェクトは非常に軽量です。それは主に私自身の使用、またはそれをサポートできる蒸散プロセスが整っている他のユーザーを対象としています。私はこれらの依存関係で「バニラes6」を達成しようとしています。
ThinkingInBits

2
package.jsonでbabelを設定するのを忘れていると思います。それらをpackage.json "babel":{"presets":["es2015"]}に追加
Jacob

3
注:ドキュメントによると、 --compilers必要ではなく、--require babel-register代わりに使用する必要があります。ファイル拡張子を指定する必要がある場合にのみ必要です。」
try-catch-finally

1
最後に、これを使用し"babel":{"presets": ["es2015"]}てこれを機能させることができました。
ブランドン

回答:


79

バベル<6の場合

この問題を解決する最も簡単な方法は次のとおりです。

  1. npm install babel-preset-es2015 --save-dev
  2. .babelrc内容を含むプロジェクトのルートに追加します。

    {
     "presets": [ "es2015" ]
    }

"--compilers js:babel-core / register"パラメーターを使用してmochaを実行していることを確認してください。

Babel6 / 7 +の場合

  1. npm install @babel/preset-env --save-dev
  2. .babelrc内容を含むプロジェクトのルートに追加します。

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

--compilers js:babel-register(Babel 6)または--compilers js:@babel/register(Babel 7)パラメーターでモカを実行していることを確認してください

mochaバージョン7以降の場合は、--require babel-registerまたはを--require @babel/registerそれぞれ使用します。


27
--require babel-register paramを使用してmochaを実行してみてください
kolec '23

2
@kolecこれは動作します。さらに良いのは、mocha.opts/ testディレクトリのルートにファイルを作成してそこに追加する
Martin Dawson

3
これらすべてを組み合わせてもまだ効果はありません(mocha.optsではなくコマンドライン)。
Kev

3
es2016を使用する場合は、Babelのes2016が「ES2016の内容のみをES2015にコンパイルする」ため、プリセット配列にes2016とes2015の両方が必要であることを覚えておいてください
prauchfuss

4
--compilersは非推奨になりました。--require代わりに使用してください。
robsch

46

唯一の解決策は明示的に含めることです:

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

テストヘルパーファイルで、テストコマンドでそれをmochaに渡します。

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

最終的な解決策:

registerBabel.jsを追加します:babel-core / registerを必要とする仕事を持つ別のファイル...

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

アプリケーションがbabel-nodeにも依存している場合は、entry.jsを追加します。これは、es6を含むアプリケーションのラッパーとして機能します。

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

次に、アプリケーションを実行します node entry

モカテストの場合、testHelper.jsは実行時にbabelサポートを初期化するためにregisterBabel.jsも必要です。

require('./registerBabel');

そしてモカテストを実行して mocha --require ./testHelper.js '+(test)/**/*Spec.js'

これにより、「./ test」内の「Spec.js」で終わるすべてのファイルが再帰的にテストされます。パターンをプロジェクトの仕様に一致するものに置き換えます。


3
と思われるignore正規表現は少しオフになっています。ignore: /node_modules\/(?!ProjectB)/babelRegisterファイルを機能させるために、node_modules :の直後にエスケープバックスラッシュを追加する必要がありました。そうでなければ素晴らしいようです!
hellatan 2016年

requireステートメントのため、Rollupifyを使用することはできません。requireステートメントを使用せずにこれを行う方法を知っていますか?
MikesBarto2002 2016年

これはすばらしいことですが、このようなコードを追加できず、ファイルを直接実行したいツールについてはどうでしょう。次に、をbabel-node使用してそのようなことを許可しない結果になり.babelrcます。
Evgeny

1
あなたはすごいね!サーバーを実行しているだけで、BabelがES6コードを処理していましたが、モカテストは失敗しました。あなたの答えはそれを解決しました。mocha.optsで--compilersを試してみましたが、インポート文が失敗しました。
エネルギッシュなピクセル2017

1
これを機能させることはできませんでしたが、私はbabelrcを拡張する必要があることもわかりました: `` `require( '@ babel / register')({extends: './.babelrc'、ignore:[/ node_modules \ /(?! ProjectB)/]}); `` `
TiggerToo

26

確かにあなたはその問題を抱えているでしょう、あなたはモカが知らないES6を使っています

あなたはバベルを使用していますが、テストでは使用していません...

いくつかのソリューション:

A. NPMを使用して実行している場合

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

B.使用しています

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

C. cliから:

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

詳細については、http://www.pauleveritt.org/articles/pylyglot/es6_imports/をご覧ください。


1
どうもありがとうございます!--compilers js:babel-core / registerオプションがありませんでした
mycargus

1
私はすでにこれをしていました...あなたは最初の質問を読みましたか?
ThinkingInBits

1
@ThinkingInBits最終的に何を使用しましたか、どのようにして(あなたがした場合)問題を解決しましたか?私はここで深刻な問題を抱えています。これらのオプションのほとんどを試しました
Milan Velebit 2017年

--compilersは現在非推奨になっ--requireています。安全な唯一のオプションです
Ali Ghanavatian

23

同じ問題に遭遇しました。stackoverflow以降で他のすべてのソリューションを試した後、package.jsonにこの単純な構成を追加すると、私のためにそれを行いました:

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

その後、私のES6インポートはすべて機能しました。ちなみに、私はwebpack.config.js内に同じ設定をしていましたが、これがモカテストでも機能する唯一の方法だったようです。

これが誰かを助けることを願っています。


.babelrcファイルのスペルが間違っていたため、最初は機能していませんでした。このソリューションは機能し、推奨されるソリューションです。プロジェクトに.babelrcファイルを作成し、{"presets":["es2015"]}を追加します
AfDev

14

私は{"modules": false}私のように私の.babelrcファイルに持っていました:

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

投げていた

予期しないトークンのインポート

削除すると、モカは正常に実行されました。


これはWebpacker for Railsによって生成されました: `` `" presets ":[[" env "、{" modules ":false、" targets ":{" browsers ":"> 1% "、" uglify ":true}、 "useBuiltIns":true}]、 "react" `` `モジュールの行を削除すると、うまくいきました。
emptywalls 2017年

これにより、CircleCIがjestユニットテストの実行に失敗し、予期しないトークンインポートエラーが発生したときの問題が解決しました。+1!
Candlejack 2018年

これでうまくいきました。Rails、Webpackerなど...ありがとう!
emptywalls

8

私は同じ問題を抱えており、バベルのドキュメントを読んで修正しました BabelをMochaと統合するためのバベルのを:

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

モカとバベルのどのバージョンですか?
Ognyan Dimitrov 2017

私のバベルのバージョンがある6.26.0以外"babel-preset-env": "1.6.0""mocha": "3.5.3"
bhantol

奇妙な。これは私の問題を解決し、私の場合は純粋にドキュメントを読む問題でした。
Ognyan Dimitrov 2017

6

Babel 7とMocha 4を使用している人にとっては、パッケージ名の一部が少し変更されており、受け入れられる回答は少し古くなっています。私がしなければならなかったことは:

npm install @babel/register --saveDev

--require @babel/registerテストラインに追加しますpackage.json

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

これら@babel/polyfillを使用している場合は、非同期/待機機能などのいくつかの修正を行います。

それが誰かを助けることを願っています:)


3

--compilers 廃止予定です。

私の簡単な解決策:

npm install --save-dev babel-core

そして、package.jsonに次のようにテストスクリプトを追加します。

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

3

私はここに別のES6 + mocha + babel構成の回答を追加します。19年6月現在のものです(回答/コメントの日付を参照)。モカは廃止た--compiler旗を、そして私が使用しているというバージョンが持つその使用不能にさえ持っ--no-deprecationCF、フラグをこの

リンクされたページから関連するすべてのビットを含めないことに注意してください。それらのどれもが、最新バージョンのモカとバベルに基づいたクリーンなテストビルドに到達しなかったためです。この回答には、テストビルドを成功させるための手順が含まれているはずです。

ここ、この回答、そしてここでの指示に従って、私は以下を使用して最小の最新のバベルであると思われるものをインストールしようとしましたnpm install

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

そして、package.jsonでモカの呼び出しを次のように調整しました。

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

これはエラーにつながりました:

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

上記のように、--no-deprecation助けにはならなかった、上にリンクされたページを参照してください。ここからの指示に従って、package.jsonを調整しました。

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

そして、次のようなbabelモジュールの検索に関するエラーが発生し始めました:

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

この時点で、進行するまで、Babelパッケージのインストールを開始しました。フルインストールは次のようなものだと思います:

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

最後に必要な変更は、package.jsonのモカ呼び出しを更新して、 js:、次のようにプレフィックスを。

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

なぜこれが必要だったのかは答えられません。誰かがこれに答えられる場合はコメントを残してください。回答をより詳細な情報で更新します。

私が最後に行ったのは、プロジェクトディレクトリに.babelrcを作成し、その内容を次のようにしました。

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

私はこれを促したものを思い出すことはできませんが、私は信じているモカは認識していない文句を続けたので、それがあったとimport私のtest.js.でキーワードを 上記のように、誰かがこれに答えることができる場合はコメントを残してください。私はより良い情報で答えを更新します。


この時点で、モカテストを正常に実行できます。私はここで私の知識にギャップがあることに気づきました。私は多くの製品のJavaScriptコードを記述しましたが、私は相対的なノードの初心者です。これを見てさらに答えを追加する人は誰でも、コメントを残してください。私が答えを改善するか、独自のより良い答えを残します。
pb2q

2

私はbabel 6.XXを使用する最も簡単な方法は、nycを使用してから、helperファイルをpckage.json

これが私が使ったものです

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"
    ]
  }
}

バベルク

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

これで、テストまたは必要な場所でes6を使用できるようになります。私はすべて失敗しています;)

その後npm run test、発砲しますnyc mocha --reporter tap 'test/**/*.spec.js'


2

ここに私のために働いたものがあります。--compilersフラグを使用すると警告が表示されました。

DeprecationWarning:「--compilers」はMochaの将来のバージョンで削除される予定です。詳細については、https://git.io/vdcSrを参照してください

したがって、--requireフラグに置き換えました

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

ここに私があり.babelrcます:

{
  "presets": ["env"]
}

私のpackage.json開発依存関係

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

2

今朝、次の手順でこの問題を解決しました

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

私は今朝この問題を公式のBabelの使用手順からの以下の手順で解決しましたをMocha 4のための:

NPMモジュールをインストールする

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

または単一のコマンド:

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

コードでmocha使用すると、まったく同じエラーがインストールされてしまいましたimport。次のアクションを実行することにより、問題は修正されました。

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

次に、.babelrcファイルを追加します。

{
    "presets": [
        "es2015"
    ]
}

そしてmocha、このように実行します:

mocha --compilers js:babel-core/register

-1

同じ問題がありました。テストを実行しているときに、依存するモジュールを実際にスタブ化したいと思っていました。単体テストに適しており、babelがサブモジュールを変換するのを防ぎます。だから私は使用しましたproxyquire、すなわち:

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

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

これはコメントとしてより適しています。
Gajus 2016年

-3

より将来性のある設定に

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

と.babelrc

{
  "presets": [ "latest" ]
}

とは対照的に...

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

そして

{
 "presets": [ "es2015" ]
}

2
この回答は実際にはこの質問に関連していないと思います。または、別の回答へのコメントとして追加できます
62mkv

@ 62mkvありがとう!鷹になり、この場所を清潔に保つ方法。
Phil Henry Mcboob 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.