运行摩卡testing时,Babel意外的令牌导入

在其他相关问题中提供的解决scheme,例如在.babelrc中包含正确的预设(es2015),已经在我的项目中实现。

我有两个项目(让我们称之为A和B)都使用ES6模块语法。 在项目A中,我正在导入通过npm安装的项目B,并且位于node_modules文件夹中。 当我运行我的testing套件的项目A,我收到错误:

SyntaxError:意外的标记导入

项目B中这个所谓的错误的代码行之前:

(函数(exports,require,module,__filename,__dirname){从'history / lib / createBrowserHistory'导入createBrowserHistory;

因为我的源文件只包含“history / lib / createBrowserHistory”导入createBrowserHistory;项目B的testing套件中的unit testing运行良好,如果我作为依赖从项目B中删除项目项目A,我的testing套件(仍然使用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的testing命令:

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

这个StackOverflow文章是相似的,但是没有提供我使用命令行的解决scheme: 从node_modules用babel导入模块,但失败

解决这个问题最简单的方法是:

  1. npm install babel-preset-es2015 --save-dev
  2. .babelrc添加到具有以下内容的项目的根目录中:

     { "presets": [ "es2015" ] } 

似乎唯一的解决办法是明确包括:

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

在testing助手文件中,并在我的testing命令中传递给mocha:

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

最终的解决scheme:

添加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运行您的应用程序

对于摩卡testing, testHelper.js应该要求registerBabel.js以及在运行时初始化babel支持。

 require('./registerBabel'); 

mocha --require ./testHelper.js '+(test)/**/*Spec.js'运行你的摩卡testingmocha --require ./testHelper.js '+(test)/**/*Spec.js'

这将以“./test”内的recursion方式testing任何以“Spec.js”结尾的文件。 用与您的项目中的规格匹配的模式来replace模式。

我遇到了同样的问题。 尝试了所有其他解决scheme在stackoverflow和更多,在package.json上添加这个简单的configuration对我来说:

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

之后,我所有的ES6import产品都开始了。 顺便说一下,我在webpack.config.js里有这个相同的configuration,但显然这是使它在mochatesting中工作的唯一方法。

希望这有助于某人。

那么确定你会有这个问题,你正在使用摩卡不知道的ES6

所以你使用的是babel,但是你没有在testing中使用它。

很less的解决scheme:

答:如果你使用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:

摩卡 – 编译器js:babel-core / registertesting* .js

你可以阅读http://www.pauleveritt.org/articles/pylyglot/es6_imports/

我的.babelrc文件中有{"modules": false} ,如下所示:

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

这是投掷

意外的令牌导入

一旦我删除它,摩卡跑了成功。

我有同样的问题,并通过阅读巴贝尔文档来整理 Babel和Mocha:

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

我发现使用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" ] } } 

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

现在,您可以在testing或任何需要的地方使用es6。 我的全部都失败了;)

然后npm run test将触发nyc mocha --reporter tap 'test/**/*.spec.js'

我有同样的问题。 运行testing时,我意识到我实际上想要存根相关的模块。 这对于unit testing是有好处的,并且可以防止babel转换子模块。 所以我使用了proxyquire ,即:

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

为更加未来的certificate设置

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

和.babelrc中

 { "presets": [ "latest" ] } 

而不是…

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

 { "presets": [ "es2015" ] }