Неожиданный импорт токенов 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, но не удалось

891   14  

14 ответов:

Для Вавилона

самый простой способ решить эту проблему:

  1. npm install babel-preset-es2015 --save-dev
  2. добавить .babelrc в корень проекта с содержимым:

    {
     "presets": [ "es2015" ]
    }
    

убедитесь, что вы используете mocha с параметром "--compilers js:babel-core/register".

Для Babel6 / 7+

  1. npm install @babel/preset-env --save-dev
  2. добавить .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

а затем добавить .babelrc file:

{
    "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.json dev зависимостей

"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

    Ничего не найдено.