运行摩卡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导入模块,但失败
解决这个问题最简单的方法是:
-
npm install babel-preset-es2015 --save-dev
-
将
.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" ] }
- 我该如何执行asynchronous摩卡testing(NodeJS)?
- NodeJS UnhandledPromiseRejectionWarning
- 如何用RSpec / RoRtestingAJAX请求?
- 你如何安装和运行Mocha,Node.jstesting模块? 安装后得到“mocha:command not found”
- 如何用Karma(testacular)testingnodejs后端代码
- 如何指定摩卡的testing目录?
- testing摩卡抛出的错误
- 如何以编程方式closuresExpressJS的实例进行testing?
- 用MochatestingJavascript中assert.equal和assert.deepEqual的区别?