Неожиданный импорт токенов Babel при выполнении тестов mocha
решения, предлагаемые в других связанных вопросах, таких как включение соответствующих пресетов (es2015) В.babelrc, уже реализованы в моем проекте.
у меня есть два проекта (назовем их A и B), которые оба используют синтаксис модуля ES6. В проекте A я импортирую проект B, который установлен через npm и живет в папке node_modules. Когда я запускаю свой набор тестов для проекта A, я получаю сообщение об ошибке:
SyntaxError: неожиданный токен импорт
которому предшествует эта якобы ошибочная строка кода из проекта B:
(function (exports, require, module, _ _ filename, __dirname) { import
createBrowserHistory из 'history / lib / createBrowserHistory';
iife, по-видимому, является чем-то npm или, возможно, babel, поскольку мой исходный файл содержит только "импорт createBrowserHistory из" history/lib/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
вот моя тестовая команда из пакета.json:
"test": "mocha --compilers js:babel-core/register '+(test|src)/**/*Spec.js'"
этот пост StackOverflow похож, но не предлагает решение для моего использования командной строки:
импорт модуля из node_modules с babel, но не удалось
14 ответов:
Для Вавилона
самый простой способ решить эту проблему:
npm install babel-preset-es2015 --save-devдобавить
.babelrcв корень проекта с содержимым:{ "presets": [ "es2015" ] }убедитесь, что вы используете mocha с параметром "--compilers js:babel-core/register".
Для Babel6 / 7+
npm install @babel/preset-env --save-devдобавить
.babelrcв корень проекта содержание:{ "presets": [ "@babel/preset-env" ] }убедитесь, что вы используете mocha с параметром "--compilers js:babel-register"
кажется, единственное решение-явно включить:
require('babel-core/register')({ ignore: /node_modules/(?!ProjectB)/ });в файле помощника теста и передайте это мокко в моей тестовой команде:
mocha --require ./test/testHelper.js...
окончательное решение:
добавить registerBabel.js: отдельный файл, работа которого требует babel-core/register...
require('babel-core/register')({ ignore: /node_modules/(?!ProjectB)/ });добавить запись.js если ваше приложение также использует вавилонский узел. Это действует как оболочка для вашего приложения, содержащего es6.
require('./registerBabel'); require('./server'); // this file has some es6 importsзатем вы запустите приложение с
node entryдля тестирования мокко, testHelper.js должен требовать registerBabel.js также для инициализации поддержки babel во время выполнения.
require('./registerBabel');и запустите свои тесты мокко с
mocha --require ./testHelper.js '+(test)/**/*Spec.js'это будет рекурсивно проверять любой файл, заканчивающийся на " Spec.АО" внутри "./испытание." Замените шаблон с одним соответствием спецификации в вашем проекте.
ну конечно у вас будет эта проблема, вы используете ES6, что мокко не знаю
Итак, вы используете babel, но вы не используете его в своем тесте...
Несколько Решений:
A. Если вы работаете с NPM, используйте
"test": "mocha --compilers js:babel-core/register test*.js"Б. Я использую
"test": "./node_modules/.bin/mocha --compilers js:babel-core/register **/*spec.jsx"C. От cli:
mocha --компиляторы js:babel-core / register испытание.*js
Вы можете прочитать больше на http://www.pauleveritt.org/articles/pylyglot/es6_imports/
я столкнулся с той же проблемой. Попробовав все другие решения на stackoverflow и за его пределами, добавив эту простую конфигурацию в пакет.json сделал это для меня:
"babel": { "presets": [ "es2015" ] }все мои ES6 импорт работал после этого. Кстати, у меня была такая же конфигурация внутри webpack.конфиг.js, но, по-видимому, это был единственный способ заставить его работать и для тестирования мокко.
надеюсь, это кому-то поможет.
Я
{"modules": false}в моем .файл babelrc, вот так:"presets": [ ["es2015", {"modules": false}], "stage-2", "react" ], который бросал
неожиданный токен импорт
после того, как я удалил его, мокко успешно.
У меня была такая же проблема, и я исправил ее, прочитав из Бабель документации для интеграции Babel с Мокко:
{ "scripts": { "test": "mocha --compilers js:babel-register" } }
Я нашел самый простой способ сделать с Вавилоном 6.X. X должен был использовать nyc, а затем добавить в на
pckage.jsonтак вот, что я использовал
пакета.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')();теперь вы сможете использовать es6 в своих тестах или там, где вам нужно. Мои все терпят неудачу ;)
затем
npm run testкоторый будет стрелять выклnyc mocha --reporter tap 'test/**/*.spec.js'
--compilersустарела.мое простое решение:
npm install --save-dev babel-coreи в пакете.json добавьте свой тестовый скрипт следующим образом:
"scripts": { "test": "mocha --require babel-core/register ./test/**/*.js -r ./test-setup.js" },
Я решил эту проблему сегодня утром со следующими инструкциями от должностным лицом с использованием инструкции Бабеля для Мокко 4:
установить модули NPM
npm install --save-dev babel-polyfill npm install --save-dev babel-preset-env npm install --save-dev babel-registerили одна команда:
npm i -d babel-polyfill babel-preset-env babel-registerпакета.json:
"scripts": { "test": "mocha --require babel-polyfill --require babel-register" }.babelrc
{ "presets": ["env"] }
Я установил
mochaи встретил точно такую же ошибку, когда я используюimportв моем коде. Выполнив следующие действия, проблема была исправлена.npm install babel-core --save-dev npm install babel-preset-es2015 --save-dev npm install babel-preset-stage-0 --save-devа затем добавить
.babelrcfile:{ "presets": [ "es2015" ] }а потом беги
mochaтаким образом:mocha --compilers js:babel-core/register
вот что сработало для меня. Я получил предупреждение при использовании
--compilersфлаг.DeprecationWarning: "-- компиляторы " будут удалены в будущей версии Мокко; см. https://git.io/vdcSr для получения дополнительной информации
поэтому я заменил его на
--requireфлаг"test": "mocha --require babel-core/register --recursive"вот мой
.babelrc:{ "presets": ["env"] }мой
package.jsondev зависимостей"devDependencies": { "babel-cli": "^6.26.0", "babel-preset-env": "^1.7.0", "mocha": "^5.2.0", }
для тех, кто использует Babel 7 и Mocha 4, некоторые имена пакетов немного изменились, и принятый ответ немного устарел. Что я должен был сделать:
npm install @babel/register --saveDevи добавить
--require @babel/registerдля теста строкиpackage.json
"test": "./node_modules/mocha/bin/mocha --require @babel/polyfill --require @babel/register './test/**/*.spec.js'"The
@babel/polyfillисправлены некоторые вещи, такие как асинхронная / ожидающая функциональность, Если вы их используете.надеюсь, что это кому-то поможет :)
у меня была та же проблема. При запуске тестов я понял, что на самом деле хотел заглушить зависимые модули. Это хорошо для модульного тестирования и предотвращает babel от преобразования подмодулей. Поэтому я использовал
proxyquire, а именно:const proxyquire = require('proxyquire').noCallThru() const myTestedModule = proxyquire('../myTestedModule', { 'dependentModule1': { //stubbed module1 }, 'dependentModule2': { //stubbed module2 } })
для более перспективное задание
npm install babel-preset-latest --save-devи в .babelrc
{ "presets": [ "latest" ] }в отличие от...
npm install babel-preset-es2015 --save-devи
{ "presets": [ "es2015" ] }
Comments