1. ホーム
  2. node.js

[解決済み] mochaのテスト実行時にBabelの予期せぬトークンがインポートされる

2022-03-04 20:23:14

質問

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

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

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

その前に、プロジェクトBの誤ったコードとされるこの行があります。

(function (exports, require, module, __filename, __dirname) { import createBrowserHistory は 'history/lib/createBrowserHistory' から。

私のソースファイルには "import createBrowserHistory from 'history/lib/createBrowserHistory'; しか含まれていないので、iifeはnpmかおそらくbabelに関連するもののようです。プロジェクトBのテストスイートのユニットテストはうまく動作し、プロジェクトAから依存としてプロジェクトBを削除すると、私のテストスイートは(まだ内部プロジェクトのモジュールに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の投稿は類似していますが、私のコマンドラインの使用に対する解決策を提供していません。 node_modules から babel でモジュールをインポートしようとしたが失敗した。

どうすればいいですか?

明示的にインクルードする以外に解決策はないようです。

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)/
});

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

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

そして、アプリケーションを実行する際に node entry

mochaのテスト用。 testHelper.js は、実行時にバベルサポートを初期化するために、registerBabel.jsも必要とします。

require('./registerBabel');

そして、mochaのテストを実行するには mocha --require ./testHelper.js '+(test)/**/*Spec.js'

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