Подтвердить что ты не робот

Валовый неожиданный импорт токена при выполнении мокко-тестов

В моем проекте уже реализованы решения, предлагаемые в других смежных вопросах, таких как включение соответствующих пресетов (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, но не удалось

4b9b3361

Ответ 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

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

  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 (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" ]
}