Валовый неожиданный импорт токена при выполнении мокко-тестов
В моем проекте уже реализованы решения, предлагаемые в других смежных вопросах, таких как включение соответствующих пресетов (es2015) в .babelrc.
У меня есть два проекта (можно назвать их A и B), которые используют синтаксис модуля ES6. В Project A я импортирую Project B, который устанавливается через npm и живет в папке node_modules. Когда я запускаю свой тестовый пакет для Project A, я получаю сообщение об ошибке:
SyntaxError: неожиданный импорт токена
которому предшествует эта предполагаемая ошибочная строка кода из проекта B:
(функция (экспорт, require, module, __filename, __dirname) {import createBrowserHistory из 'history/lib/createBrowserHistory';
iife, по-видимому, является чем-то npm или, возможно, babel, поскольку мой исходный файл содержит только "import createBrowserHistory из" history/lib/createBrowserHistory "; модульные тесты в наборе тестов Project B выполняются нормально, и если я удалю Project 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
Вот моя тестовая команда от package.json:
"test": "mocha --compilers js:babel-core/register '+(test|src)/**/*Spec.js'"
Эта запись StackOverflow похожа, но не предлагает решение для моей командной строки:
импортировать модуль из node_modules с babel, но не удалось
Ответы
Ответ 1
Кажется, единственное решение состоит в том, чтобы явно включить:
require('babel-core/register')({
ignore: /node_modules/(?!ProjectB)/
});
в файле вспомогательного теста и передайте его mocha в моей тестовой команде:
mocha --require ./test/testHelper.js...
Окончательное решение:
Добавьте 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
Для тестирования mocha testHelper.js должен также потребовать registerBabel.js для инициализации поддержки babel во время выполнения.
require('./registerBabel');
И запустите ваши тесты мокко с помощью mocha --require./testHelper.js '+(test)/**/*Spec.js'
Это будет рекурсивно проверять любой файл, заканчивающийся на "Spec.js" в пределах "./test". Замените шаблон таким, который соответствует спецификациям вашего проекта.
Ответ 2
Для Вавилона <6
Самый простой способ решить эту проблему:
-
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
(Babel 6) или --compilers js:@babel/register
(Babel 7)
Ответ 3
Уверен, что у вас будет эта проблема, вы используете ES6, что мокко не знает
Итак, вы используете babel, но не используете его в своем тесте...
Несколько решений:
а. если вы используете NPM, используйте
"test": "mocha --compilers js:babel-core/register test*.js"
В. Я использую
"test": "./node_modules/.bin/mocha --compilers js:babel-core/register **/*spec.jsx"
С. Из cli:
mocha --compilers js: babel-core/register test *.js
Вы можете прочитать больше на http://www.pauleveritt.org/articles/pylyglot/es6_imports/
Ответ 4
Я столкнулся с той же проблемой. Попробовав любое другое решение в stackoverflow и за его пределами, добавив эту простую конфигурацию на package.json, я сделал это для меня:
"babel": {
"presets": [
"es2015"
]
}
После этого все мои импорт ES6 работали.
Кстати, у меня была такая же конфигурация внутри webpack.config.js, но, видимо, это был единственный способ заставить ее работать и на мокко-тестирование.
Надеюсь, это поможет кому-то.
Ответ 5
У меня был {"modules": false}
в моем файле .babelrc, например:
"presets": [
["es2015", {"modules": false}],
"stage-2",
"react"
]
который бросал
Неожиданный импорт токена
Как только я удалил его, мокка успешно сработала.
Ответ 6
У меня была такая же проблема, и я исправил ее, прочитав из документацию для babel для интеграции Babel с Mocha:
{
"scripts": {
"test": "mocha --compilers js:babel-register"
}
}
Ответ 7
Для тех, кто использует 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'"
@babel/polyfill
исправляет некоторые вещи, такие как async/await, если вы их используете.
Надеюсь, это поможет кому-нибудь :)
Ответ 8
Я нашел самый простой способ сделать с 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"
]
}
registerBabel.js
/* eslint-disable import/no-commonjs, import/unambiguous */
require('babel-register')();
Теперь вы сможете использовать es6 в своих тестах или там, где вам нужно. Мины все проваливаются;)
Затем npm run test
, который отключит nyc mocha --reporter tap 'test/**/*.spec.js'
Ответ 9
--compilers
устарел.
Мое простое решение:
npm install --save-dev babel-core
И в package.json добавьте свой тест script следующим образом:
"scripts": {
"test": "mocha --require babel-core/register ./test/**/*.js -r ./test-setup.js"
},
Ответ 10
Вот что у меня сработало. Я получил предупреждение при использовании флага --compilers
.
Предупреждение об устаревании: "--compilers" будет удалено в будущей версии Mocha; см. https://git.io/vdcSr для получения дополнительной информации
Поэтому я заменил его на флаг --require
"test": "mocha --require babel-core/register --recursive"
Вот мой .babelrc
:
{
"presets": ["env"]
}
Мои зависимости для package.json
dev
"devDependencies": {
"babel-cli": "^6.26.0",
"babel-preset-env": "^1.7.0",
"mocha": "^5.2.0",
}
Ответ 11
Вам может потребоваться указать опцию extensions
если вы используете TypeScript:
require("@babel/register")({
extensions: ['.jsx', '.js', '.ts', '.tsx']
})
Ответ 12
Я решил эту проблему сегодня утром с помощью следующих инструкций
Установите модули NPM
npm install --save-dev @babel/polyfill
npm install --save-dev @babel/register
package.json:
"scripts": {
"test": "mocha --require @babel/register --require @babel/polyfill src/DesktopApplication/Tests",
}
.babelrc
{
"presets": ["@babel/env"]
}
Ответ 13
Я решил эту проблему сегодня утром со следующими инструкциями официальное использование инструкций Babel для Mocha 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
package.json
"scripts": {
"test": "mocha --require babel-polyfill --require babel-register"
}
.babelrc
{
"presets": ["env"]
}
Ответ 14
Я установил 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
Ответ 15
Я добавляю еще один ответ по настройке ES6 + mocha + babel здесь, текущий по состоянию на июнь 19 года (см. Даты в ответе/комментариях). --compiler
флаг --compiler
, а версия, которую я использую, недоступна даже с флагом --no-deprecation
, см. это
Обратите внимание, что я не буду включать все релевантные фрагменты со связанных страниц, потому что ни один из них не привел меня к чистой тестовой сборке, основанной на последних версиях mocha и babel; этот ответ должен включать шаги, которые привели меня к успешной тестовой сборке.
Следуя инструкциям здесь, и в этом ответе, и здесь, я попытался установить то, что оказалось минимальной последней версией, используя npm install
:
$ npm install --save-dev mocha
$ npm install --save-dev @babel/preset-env
И я настроил вызов mocha в package.json, вот так:
"scripts": {
"test": "mocha --compilers js:@babel/register"
}
Это привело к ошибкам:
× ERROR: --compilers is DEPRECATED and no longer supported.
Как и выше, --no-deprecation
не помогло, пожалуйста, перейдите по ссылке, указанной выше. Так, следуя инструкциям из здесь я настроил package.json:
"scripts": {
"test": "mocha --require js:@babel/register"
}
И начал видеть ошибки при поиске модулей babel, таких как:
× ERROR: Cannot find module '@babel/register'
В этот момент я начал устанавливать пакеты babel, пока не смог прогрессировать. Я считаю, что полная установка что-то вроде:
$ npm install --save-dev @babel/preset-env @babel/register @babel/core
Последним изменением было обновить вызов mocha в package.json, удалив префикс js:
примерно так:
"scripts": {
"test": "mocha --require @babel/register"
}
Я не могу ответить, почему это было необходимо: если кто-то может ответить на этот вопрос, пожалуйста, оставьте комментарий, и я дополню свой ответ более подробной информацией.
Последнее, что я сделал, это создал .babelrc в каталоге проекта с содержимым:
{"presets": ["@babel/preset-env"]}
Я не могу вспомнить, что это вызвало, но я полагаю, что это произошло из-за того, что Мокко продолжал жаловаться, что не распознал ключевое слово import
в моем test.js. Как и выше, если кто-то может ответить на этот вопрос, пожалуйста, оставьте комментарий, и я обновлю свой ответ с более подробной информацией.
Ответ 16
У меня была та же проблема.
Когда я запускал тесты, я понял, что на самом деле захотел блокировать зависимые модули. Он хорош для модульного тестирования и не позволяет Babel преобразовывать подмодули. Поэтому я использовал proxyquire
, а именно:
const proxyquire = require('proxyquire').noCallThru()
const myTestedModule = proxyquire('../myTestedModule', {
'dependentModule1': { //stubbed module1 },
'dependentModule2': { //stubbed module2 }
})
Ответ 17
для более надежной установки
npm install babel-preset-latest --save-dev
и в .babelrc
{
"presets": [ "latest" ]
}
в отличие от...
npm install babel-preset-es2015 --save-dev
и
{
"presets": [ "es2015" ]
}