运行Mocha测试时Babel意外导入令牌 [英] Babel unexpected token import when running mocha tests
问题描述
其他相关问题中提供的解决方案,例如在.babelrc中包含正确的预设(es2015),已在我的项目中实现.
The solutions offered in other related questions, such as including the proper presets (es2015) in .babelrc, are already implemented in my project.
我有两个项目(分别称为A和B),它们都使用ES6模块语法.在项目A中,我导入了通过npm安装的项目B,该项目位于node_modules文件夹中.当我运行项目A的测试套件时,出现错误:
I have two projects (lets call them A and B) which both use ES6 module syntax. In Project A, I'm importing Project B which is installed via npm and lives in the node_modules folder. When I run my test suite for Project A, I'm getting the error:
SyntaxError:意外的令牌导入
SyntaxError: Unexpected token import
在此之前,项目B的这行所谓的错误代码行:
Which is preceded by this alleged erroneous line of code from Project B:
(函数(导出,需求,模块,__文件名,__目录名){导入 来自'history/lib/createBrowserHistory'的createBrowserHistory;
(function (exports, require, module, __filename, __dirname) { import createBrowserHistory from 'history/lib/createBrowserHistory';
由于我的源文件仅包含从'history/lib/createBrowserHistory'导入import createBrowserHistory",因此iife似乎与npm或babel有关,因为Project B的测试套件中的单元测试运行良好,并且如果我将Project B删除为来自Project A的依赖项,然后我的测试套件(仍然对内部项目模块使用es6导入)就可以正常工作.
The iife appears to be something npm or possibly babel related since my source file only contains "import createBrowserHistory from 'history/lib/createBrowserHistory'; The unit tests in Project B's test suite runs fine, and if I remove Project B as a dependency from Project A, my test suite then (still using es6 imports for internal project modules) works just fine.
完整堆栈跟踪:
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的测试命令:
Here is my test command from package.json:
"test": "mocha --compilers js:babel-core/register '+(test|src)/**/*Spec.js'"
此StackOverflow帖子类似,但没有为我使用命令行提供解决方案: 从带有babel的node_modules中导入模块但失败了
This StackOverflow post is similar but doesn't offer a solution for my use of the command line: import a module from node_modules with babel but failed
推荐答案
似乎唯一的解决方案是显式包括:
It seems the only solution is to explicitly include:
require('babel-core/register')({
ignore: /node_modules/(?!ProjectB)/
});
放在测试帮助文件中,然后在我的测试命令中将其传递给mocha:
in a test helper file, and pass that along to mocha in my test command:
mocha --require ./test/testHelper.js...
最终解决方案:
添加 registerBabel.js :一个单独的文件,其工作是需要babel-core/register ...
Add registerBabel.js: a separate file whose job is to require babel-core/register...
require('babel-core/register')({
ignore: /node_modules/(?!ProjectB)/
});
如果您的应用程序还依赖于babel-node,请添加 entry.js .这可以作为包含es6的应用程序的包装.
Add an entry.js if your application also relies on babel-node. This acts as a wrapper for your es6 containing application.
require('./registerBabel');
require('./server'); // this file has some es6 imports
然后您将使用node entry
对于Mocha测试, testHelper.js 也应要求registerBabel.js在运行时初始化babel支持.
For mocha testing, testHelper.js should require registerBabel.js as well to initialize babel support at run time.
require('./registerBabel');
并使用mocha --require ./testHelper.js '+(test)/**/*Spec.js'
这将递归地测试"./test"中任何以"Spec.js"结尾的文件.用一种与您的项目中的规范匹配的模式替换该模式.
This will recursively test any file ending in "Spec.js" within "./test". Substitute the pattern with one matching the specs in your project.
这篇关于运行Mocha测试时Babel意外导入令牌的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!