Node.js Babel在运行mocha测试时意外导入令牌

Node.js Babel在运行mocha测试时意外导入令牌,node.js,npm,syntax-error,mocha.js,babeljs,Node.js,Npm,Syntax Error,Mocha.js,Babeljs,在其他相关问题中提供的解决方案,例如在.babelrc中包含适当的预设(es2015),已经在我的项目中实施 我有两个项目(我们称它们为A和B),它们都使用ES6模块语法。在项目A中,我正在导入通过npm安装的项目B,该项目位于node_modules文件夹中。当我为项目A运行测试套件时,我得到了错误: SyntaxError:意外的令牌导入 前面是项目B中的这一错误代码行: (函数(导出、要求、模块、_文件名、_目录名){import 从“history/lib/createBrowserHi

在其他相关问题中提供的解决方案,例如在.babelrc中包含适当的预设(es2015),已经在我的项目中实施

我有两个项目(我们称它们为A和B),它们都使用ES6模块语法。在项目A中,我正在导入通过npm安装的项目B,该项目位于node_modules文件夹中。当我为项目A运行测试套件时,我得到了错误:

SyntaxError:意外的令牌导入

前面是项目B中的这一错误代码行:

(函数(导出、要求、模块、_文件名、_目录名){import 从“history/lib/createBrowserHistory”创建BrowserHistory

iife似乎与npm或babel有关,因为我的源文件仅包含“从'history/lib/createBrowserHistory'导入createBrowserHistory”;项目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
此StackOverflow帖子与此类似,但没有为我使用命令行提供解决方案:

似乎唯一的解决方案是明确包括:

require('babel-core/register')({
  ignore: /node_modules/(?!ProjectB)/
}); 
在测试助手文件中,并在我的测试命令中将其传递给mocha:

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

最终解决方案:

Addregisterbael.js:一个单独的文件,其任务是要求babel core/register

require('babel-core/register')({
  ignore: /node_modules/(?!ProjectB)/
});
如果您的应用程序还依赖于babel节点,请添加一个entry.js。这将充当包含es6的应用程序的包装器

require('./registerBabel');
require('./server'); // this file has some es6 imports
然后使用
节点条目运行应用程序

对于mocha测试,testHelper.js应该要求registerbael.js在运行时初始化babel支持

require('./registerBabel');
并使用
mocha--require./testHelper.js'+(test)/***/Spec.js'

这将递归测试“/test”中以“Spec.js”结尾的任何文件。用一个与项目中的规范匹配的模式替换该模式。

对于Babel我也有同样的问题。 当运行测试时,我意识到我实际上想要存根依赖模块。这有利于单元测试并防止babel转换子模块。因此我使用了
proxyquire
,即:

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

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

我遇到了同样的问题。在stackoverflow和其他解决方案上尝试了所有其他解决方案后,在package.json上添加了这个简单的配置为我做到了:

  "babel": {
    "presets": [
      "es2015"
    ]
  }
在那之后,我所有的ES6导入都成功了。 顺便说一句,我在webpack.config.js中有相同的配置,但显然这是让它也能用于mocha测试的唯一方法


希望这对其他人有所帮助。

当然你会遇到这个问题,你使用的是摩卡不知道的ES6

所以你用的是巴贝尔,但你在测试中没有用它

几种解决方案:

A.如果您使用NPM运行,请使用

“测试”:“摩卡——编译器js:babel核心/注册测试*.js”

我正在使用

“测试”:“/node\u modules/.bin/mocha——编译器js:babel core/register**/*spec.jsx”

C.从cli:

mocha——编译器js:babel核心/寄存器测试*.js


您可以在

上阅读更多内容,了解更具前瞻性的设置

npm install babel-preset-latest --save-dev
在巴别塔

{
  "presets": [ "latest" ]
}
相对于

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

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

"presets": [
    ["es2015", {"modules": false}],
    "stage-2",
    "react"
]
哪个是投掷

意外的令牌导入


一旦我删除了它,mocha就成功地运行了。

我发现使用babel 6.X.X最简单的方法是使用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"
  ]
}
{
  "presets": ["env"]
}
{
  "presets": ["@babel/env"]
}
registerbel.js

/* eslint-disable import/no-commonjs, import/unambiguous */
require('babel-register')();
npm install --save-dev babel-polyfill
npm install --save-dev babel-preset-env
npm install --save-dev babel-register
npm install --save-dev @babel/polyfill
npm install --save-dev @babel/register
现在,您可以在测试中或任何需要的地方使用es6。我的测试都失败了;)


然后,
npm运行测试
将触发
nyc摩卡——记者点击'test/***.spec.js'

我遇到了同样的问题,并通过阅读Babel与摩卡的集成:

{
  "scripts": {
    "test": "mocha --compilers js:babel-register"
  }
}
--编译器
已弃用

我的简单解决方案:

npm install --save-dev babel-core
在package.json中添加测试脚本,如下所示:

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

今天早上,我按照摩卡4的以下说明解决了这个问题:

安装NPM模块

/* eslint-disable import/no-commonjs, import/unambiguous */
require('babel-register')();
npm install --save-dev babel-polyfill
npm install --save-dev babel-preset-env
npm install --save-dev babel-register
npm install --save-dev @babel/polyfill
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"
  }
"scripts": {
    "test": "mocha --require @babel/register --require @babel/polyfill src/DesktopApplication/Tests",
  }
.babelrc

{
  "presets": [
    "es2015", //remove the {modules: false} it doesn't work with this
    "stage-2"
  ]
}
{
  "presets": ["env"]
}
{
  "presets": ["@babel/env"]
}

我安装了
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

以下是对我有效的方法。我在使用
--compilers
标志时收到警告

弃用警告:“--编译器”将在将来的版本中删除 有关摩卡咖啡的详细信息,请参阅

因此,我将其替换为
--require
标志

"test":  "mocha --require babel-core/register --recursive"
这是我的
.babelrc

{
  "presets": ["env"]
}
My
package.json
dev依赖项

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

对于任何使用Babel 7和Mocha 4的人来说,一些软件包名称已经发生了一些变化,而公认的答案有点过时。我必须做的是:


npm安装@babel/注册器--saveDev

并将
--require@babel/register
添加到
package.json


“测试”:“/node_modules/mocha/bin/mocha--require@babel/polyfill--require@babel/register”。/test/***.spec.js”

@babel/polyfill
修复了一些东西,如异步/等待功能(如果您碰巧正在使用这些功能)

希望这对某人有所帮助:)

如果您使用的是TypeScript,您可能需要:

require("@babel/register")({
  extensions: ['.jsx', '.js', '.ts', '.tsx']
})

今天上午,我按照以下说明解决了此问题

安装NPM模块

/* eslint-disable import/no-commonjs, import/unambiguous */
require('babel-register')();
npm install --save-dev babel-polyfill
npm install --save-dev babel-preset-env
npm install --save-dev babel-register
npm install --save-dev @babel/polyfill
npm install --save-dev @babel/register
package.json

"scripts": {
    "test": "mocha --require babel-polyfill --require babel-register"
  }
"scripts": {
    "test": "mocha --require @babel/register --require @babel/polyfill src/DesktopApplication/Tests",
  }
<
{
    "presets" : ["@babel/preset-env"]
}