mocha 테스트를 실행할 때 Babel 예기치 않은 토큰 가져 오기


95

.babelrc에 적절한 사전 설정 (es2015)을 포함하는 것과 같은 다른 관련 질문에서 제공되는 솔루션은 이미 내 프로젝트에 구현되어 있습니다.

ES6 모듈 구문을 사용하는 두 개의 프로젝트 (A와 B라고 부릅니다)가 있습니다. 프로젝트 A에서는 npm을 통해 설치되고 node_modules 폴더에있는 프로젝트 B를 가져옵니다. 프로젝트 A에 대한 테스트 스위트를 실행할 때 오류가 발생합니다.

SyntaxError : 예기치 않은 토큰 가져 오기

프로젝트 B의 잘못된 코드 줄이 앞에 있습니다.

(function (exports, require, module, __filename, __dirname) {import createBrowserHistory from 'history / lib / createBrowserHistory';

내 소스 파일에 "import createBrowserHistory from 'history / lib / createBrowserHistory'만 포함되어 있기 때문에 iife는 npm 또는 바벨과 관련된 것으로 보입니다. 프로젝트 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

다음은 package.json의 테스트 명령입니다.

"test": "mocha --compilers js:babel-core/register '+(test|src)/**/*Spec.js'"

이 StackOverflow 게시물은 비슷하지만 명령 줄 사용에 대한 솔루션을 제공하지 않습니다. babel을 사용하여 node_modules에서 모듈을 가져 오지만 실패했습니다.


1
npm에서 모듈을 배포하는 경우 해당 모듈의 트랜스 파일 된 버전 만 배포해야합니다.
loganfsmyth

이 프로젝트는 매우 가볍습니다. 그것은 주로 내 자신 또는 다른 사람들이 그것을 지원할 수있는 증산 과정이있는 경우에 사용하기위한 것입니다. 이러한 종속성에서 "바닐라 es6"을 달성하려고합니다.
ThinkingInBits

2
package.json에서 바벨을 구성하는 것을 잊은 것 같습니다. package.json "babel": { "presets": [ "es2015"]}에 추가하십시오.
Jacob

3
참고 : 문서에 따르면 --compilers 필요하지 않으며 --require babel-register대신 사용해야합니다. "ES6 모듈에 .js 확장자가있는 경우 npm install --save-dev babel-register 및 mocha --require babel-register; --compilers를 사용할 수 있습니다. 파일 확장자를 지정해야하는 경우에만 필요합니다. "
try-catch-finally

1
마침내 나는 이것을 사용하여 작동시킬 수 있었고 "babel":{"presets": ["es2015"]}마지막으로 놓친 것이있었습니다!
브랜든

답변:


81

Babel <6 용

이 문제를 해결하는 가장 쉬운 방법은 다음과 같습니다.

  1. npm install babel-preset-es2015 --save-dev
  2. .babelrc컨텐츠와 함께 프로젝트의 루트에 추가하십시오 .

    {
     "presets": [ "es2015" ]
    }
    

"--compilers js : babel-core / register"매개 변수를 사용하여 mocha를 실행하고 있는지 확인하십시오.

Babel6 / 7 + 용

  1. npm install @babel/preset-env --save-dev
  2. .babelrc컨텐츠와 함께 프로젝트의 루트에 추가하십시오 .

    {
     "presets": [ "@babel/preset-env" ]
    }
    

--compilers js:babel-register(Babel 6) 또는 --compilers js:@babel/register(Babel 7) 매개 변수로 mocha를 실행하고 있는지 확인하십시오.

mocha 버전 7 이상의 경우 --require babel-register또는 --require @babel/register각각을 사용하십시오 .


27
--require 바벨 - 레지스터 PARAM와 모카를 실행하십시오
kolec

2
@kolec 작동합니다. 더 나은 그래도 생성 mocha.opts/ 테스트 디렉토리의 루트에 파일을 거기에 추가
마틴 도슨

3
이 모든 것이 여전히 도움이되지 않습니다 (mocha.opts가 아닌 명령 줄).
Kev

3
es2016을 사용하려는 경우 Babel의 es2016은 "ES2016에있는 내용 만 ES2015로 컴파일"하므로 사전 설정 배열에 es2016과 es2015 가 모두 필요 합니다
prauchfuss

4
--compilers이제 더 이상 사용되지 않습니다. --require대신 사용하십시오 .
robsch

46

유일한 해결책은 다음을 명시 적으로 포함하는 것입니다.

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)/
});

애플리케이션이 babel-node에 의존하는 경우 entry.js를 추가 하십시오. 이것은 애플리케이션이 포함 된 es6의 래퍼 역할을합니다.

require('./registerBabel');
require('./server'); // this file has some es6 imports

그런 다음 응용 프로그램을 node entry

mocha 테스트의 경우 testHelper.js 는 런타임에 babel 지원을 초기화하기 위해 registerBabel.js도 필요합니다.

require('./registerBabel');

그리고 모카 테스트를 mocha --require ./testHelper.js '+(test)/**/*Spec.js'

이것은 "./test"내에서 "Spec.js"로 끝나는 모든 파일을 재귀 적으로 테스트합니다. 프로젝트의 사양과 일치하는 패턴으로 대체합니다.


3
ignore정규식이 약간 벗어난 것 같습니다 . ignore: /node_modules\/(?!ProjectB)/babelRegister 파일이 작동하려면 node_modules : 바로 뒤에 이스케이프 백 슬래시를 추가해야했습니다 . 그렇지 않으면 멋져 보입니다!
hellatan 2016

require 문 때문에 Rollupify를 사용할 수 없습니다. require 문을 사용하지 않고이 작업을 수행하는 방법을 알고 계십니까?
MikesBarto2002

이것은 훌륭하지만 이와 같은 코드를 추가 할 수없고 파일을 직접 실행하려는 도구는 어떻습니까? 그런 다음을 babel-node사용하여 그러한 것을 허용하지 않는 것으로 끝납니다 .babelrc.
Evgeny

1
너 진짜 최고 다! Babel은 서버를 실행할 때 ES6 코드를 처리했지만 모카 테스트는 실패했습니다. 당신의 대답이 그것을 해결했습니다. mocha.opts에서 --compilers를 시도했지만 이로 인해 import 문이 실패했습니다.
Energetic Pixels

1
이 작업을 수행 할 수 없었지만 babelrc를 확장해야한다는 사실도 밝혀졌습니다.```require ( '@ babel / register') ({extends : './.babelrc', ignore : [/ node_modules \ / (?! ProjectB) /]}); ```
TiggerToo

26

확실히 당신은 그 문제가있을 것입니다. 당신은 모카가 모르는 ES6를 사용하고 있습니다.

그래서 바벨을 사용하고 있지만 테스트에서 사용하지 않습니다.

몇 가지 솔루션 :

A. NPM으로 실행하는 경우

"test": "mocha --compilers js:babel-core/register test*.js"

B. 사용하고 있습니다

"test": "./node_modules/.bin/mocha --compilers js:babel-core/register **/*spec.jsx"

C. cli에서 :

mocha --compilers js : babel-core / register test * .js

http://www.pauleveritt.org/articles/pylyglot/es6_imports/ 에서 자세한 내용을 읽을 수 있습니다 .


1
정말 고맙습니다! --compilers js : babel-core / register 옵션이 누락되었습니다
mycargus

1
벌써 이걸하고 있었는데 ... 첫 질문도 읽었나요?
ThinkingInBits

1
@ThinkingInBits 무엇을 사용하게 되었습니까? 문제를 어떻게 해결 했습니까? 여기에 심각한 문제가 있습니다. 대부분의 옵션을 시도했습니다
Milan Velebit

--compilers지금은 사용되지 않습니다 같은 외모 --require갈 수있는 유일한 옵션은 안전입니다
알리 Ghanavatian

23

나는 같은 문제에 부딪쳤다. stackoverflow 이상에서 다른 모든 솔루션을 시도한 후 package.json 에이 간단한 구성을 추가하면 나를 위해 해냈습니다.

  "babel": {
    "presets": [
      "es2015"
    ]
  }

그 후 모든 ES6 가져 오기가 작동했습니다. 그건 그렇고, 나는 webpack.config.js 내에 동일한 구성을 가지고 있었지만 분명히 이것이 모카 테스트에서도 작동하도록 만드는 유일한 방법이었습니다.

이것이 누군가를 돕기를 바랍니다.


.babelrc 파일의 철자가 잘못되어 처음에는 작동하지 않았습니다. 이 솔루션은 작동하며 권장되는 솔루션입니다. 프로젝트에 .babelrc 파일을 만들고 { "presets": [ "es2015"]} 추가
AfDev

14

나는했다 {"modules": false}과 같이, 내 .babelrc 파일 :

"presets": [
    ["es2015", {"modules": false}],
    "stage-2",
    "react"
]

던지고 있던

예기치 않은 토큰 가져 오기

일단 제거하면 모카가 성공적으로 실행되었습니다.


이것은 Webpacker for Rails에 의해 생성되었습니다.``` "presets": [[ "env", { "modules": false, "targets": { "browsers": "> 1 %", "uglify": true}, "useBuiltIns": true}], "react"```일단 모듈 라인을 제거하면 저에게 효과적이었습니다.
emptywalls

이것은 CircleCI가 내 농담 단위 테스트를 실행하지 못하고 예기치 않은 토큰 가져 오기 오류를 제공했을 때 내 문제를 해결했습니다. +1!
Candlejack

이것은 나를 위해 해냈습니다. Rails, Webpacker 등 ... 감사합니다!
emptywalls

8

나는 같은 문제가 있었고 Babel을 Mocha와 통합하기위한 babel 문서 에서 읽음으로써 수정했습니다 .

{
  "scripts": {
    "test": "mocha --compilers js:babel-register"
  }
}

Mocha 및 Babel 버전은 무엇입니까?
Ognyan Dimitrov 2017

내 바벨 버전은 6.26.0제외 "babel-preset-env": "1.6.0"하고 "mocha": "3.5.3"
bhantol

이상한. 이것은 내 문제를 해결했으며 내 경우에는 순수한 문서 읽기 문제였습니다.
Ognyan Dimitrov

6

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수정 비동기 / await를 기능과 같은 몇 가지 당신은 그를 사용하는 일이 있다면.

누군가를 돕는 희망 :)


4

나는 여기에 또 다른 ES6 + mocha + babel 구성 답변을 추가하고 있으며, 현재는 '19 년 6 월 현재입니다 (답변 / 코멘트의 날짜 참조). 모카는 사용되지 않는 한 --compiler깃발을, 그리고 내가 사용하는 버전과 그 사용할 수도있다 --no-deprecationCF, 플래그를

링크 된 페이지의 관련 비트를 모두 포함하지는 않을 것입니다. 그 중 어느 것도 최신 버전의 mocha 및 babel을 기반으로 한 깨끗한 테스트 빌드를 얻지 못하기 때문입니다. 이 답변에는 성공적인 테스트 빌드를위한 단계가 포함되어야합니다.

여기의 지침에 따라, 그리고에 이 대답 하고, 여기 , 내가 사용하는 최소한의 최신 바벨로 보이는 것을 설치하려고 npm install:

$ npm install --save-dev mocha
$ npm install --save-dev @babel/preset-env

그리고 package.json에서 mocha 호출을 다음과 같이 조정했습니다.

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

그리고 다음과 같은 바벨 모듈 찾기에 대한 오류를보기 시작했습니다.

× ERROR: Cannot find module '@babel/register'

이 시점에서 나는 진행할 수있을 때까지 바벨 패키지 설치를 시작했다. 전체 설치는 다음과 같다고 생각합니다.

$ npm install --save-dev @babel/preset-env @babel/register @babel/core

마지막으로 필요한 변경은 package.json에서 mocha 호출을 업데이트하고 js:다음과 같이 접두사를 제거하는 것입니다.

"scripts": {
    "test": "mocha --require @babel/register"
}

왜 이것이 필요한지 대답 할 수 없습니다. 누군가 대답 할 수 있다면 댓글을 남겨 주시면 더 나은 정보로 대답을 업데이트하겠습니다.

내가 마지막으로 한 일은 프로젝트 디렉토리에 .babelrc를 생성하는 것이 었습니다.

{
    "presets" : ["@babel/preset-env"]
}

나는 이것이 무엇을 유발했는지 기억할 수 없지만 내 test.js 에서 키워드를 인식하지 못하는 것에 대해 mocha가 계속해서 불평했기 때문 이라고 생각 합니다. import위와 같이 누군가가 대답 할 수 있다면 댓글을 남겨 주시면 더 나은 정보로 답변을 업데이트하겠습니다.


이 시점에서 모카 테스트를 성공적으로 실행할 수 있습니다. 여기에 내 지식에 차이가 있다는 것을 알고 있습니다. 저는 많은 프로덕션 자바 스크립트 코드를 작성했지만 상대적인 노드 멍청이입니다. 답변에 추가 할 내용이 더있는 것을 본 사람은 댓글을 남겨 주시면 답변을 개선하거나 더 나은 답변을 남겨 드리겠습니다.
pb2q

3

--compilers 더 이상 사용되지 않습니다.

내 간단한 해결책 :

npm install --save-dev babel-core

그리고 package.json에서 다음과 같이 테스트 스크립트를 추가하십시오.

  "scripts": {
    "test": "mocha --require babel-core/register ./test/**/*.js -r ./test-setup.js"
  },

2

babel 6.XX로 가장 쉽게 할 수있는 방법은 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"
    ]
  }
}

바벨 르크

{
  "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'


2

여기에 저에게 효과적이었습니다. --compilers깃발을 사용할 때 경고를 받았습니다 .

DeprecationWarning : "--compilers"는 향후 버전의 Mocha에서 제거됩니다. 참조 https://git.io/vdcSr을 추가 정보를 원하시면

따라서 나는 그것을 --require깃발 로 대체했습니다.

"test":  "mocha --require babel-core/register --recursive"

여기 내 .babelrc:

{
  "presets": ["env"]
}

package.json개발 종속성

"devDependencies": {
  "babel-cli": "^6.26.0",
  "babel-preset-env": "^1.7.0",
  "mocha": "^5.2.0",
}

2

오늘 아침 다음 지침에 따라이 문제를 해결했습니다.

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

1

오늘 아침 Mocha 4에 대한 공식 Babel 사용 지침의 다음 지침 에 따라이 문제를 해결했습니다 .

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


0

내 코드에서 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

-1

나는 같은 문제가 있었다. 테스트를 실행할 때 실제로 종속 모듈을 스텁하고 싶다는 것을 깨달았습니다. 단위 테스트에 좋고 바벨이 서브 모듈을 변환하는 것을 방지합니다. 그래서 저는 다음을 사용했습니다 proxyquire.

const proxyquire = require('proxyquire').noCallThru()

const myTestedModule = proxyquire('../myTestedModule', {
    'dependentModule1': { //stubbed module1 },
    'dependentModule2': { //stubbed module2 }
})

이것은 주석으로 더 적합합니다.
Gajus

-3

보다 미래의 증거 설정을 위해

npm install babel-preset-latest --save-dev

및 .babelrc

{
  "presets": [ "latest" ]
}

반대로 ...

npm install babel-preset-es2015 --save-dev

{
 "presets": [ "es2015" ]
}

2
나는 ..이 답변이 실질적으로이 질문에 관련되지 않은 추측하거나 오히려 다른 대답에 주석으로 추가 할 수 있습니다
62mkv

@ 62mkv 감사합니다! 매가되어 이곳을 깨끗하게 유지하는 방법.
Phil Henry Mcboob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.