Mocha testleri çalıştırılırken Babel beklenmeyen jeton içe aktarımı


95

.Babelrc içindeki uygun ön ayarları (es2015) dahil etmek gibi diğer ilgili sorularda sunulan çözümler zaten projemde uygulanmıştır.

Her ikisi de ES6 modül sözdizimi kullanan iki projem var (bunları A ve B diyelim). Proje A'da, npm aracılığıyla kurulan ve node_modules klasöründe yaşayan Proje B'yi içe aktarıyorum. Proje A için test paketimi çalıştırdığımda şu hatayı alıyorum:

SyntaxError: Beklenmeyen belirteç içe aktarma

Bundan önce Proje B'deki bu sözde hatalı kod satırı gelir:

(işlev (dışa aktarım, gerekli, modül, __filename, __dirname) {createBrowserHistory dosyasını 'history / lib / createBrowserHistory'den içe aktarın;

Kaynak dosyam yalnızca "içe aktarma createBrowserHistory 'geçmiş / lib / createBrowserHistory'den' içerdiği için iife, npm veya muhtemelen babel ile ilgili bir şey gibi görünüyor; Proje B'nin test paketindeki birim testleri sorunsuz çalışıyor ve Project B'yi bağımlılık olarak kaldırırsam Proje A, benim test paketim (hala dahili proje modülleri için es6 içe aktarımı kullanıyor) gayet iyi çalışıyor.

Tam Yığın İzleme:

 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'daki test komutum:

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

Bu StackOverflow gönderisi benzer, ancak komut satırı kullanımım için bir çözüm sunmuyor: babel ile node_modules'ten bir modülü içe aktarın ancak başarısız oldu


1
Bir modülü npm'de dağıtıyorsanız, yalnızca o modülün kopyalanmış sürümünü dağıtmalısınız.
loganfsmyth

Bu proje çok hafiftir. Çoğunlukla kendi kullanımım için veya onu destekleyebilecek bir terleme süreci varsa başkaları için tasarlandı. Bu bağımlılıklarda "vanilla es6" elde etmeye çalışıyorum.
ThinkingInBits

2
Paket.json'daki babel'i yapılandırmayı unuttuğunuzu düşünüyorum. bunları package.json "babel" listenize ekleyin: {"presets": ["es2015"]}
Jacob

3
Not: Belgelere göre --compilers gerekli değildir, --require babel-registeryerine kullanılmalıdır: "ES6 modüllerinizin uzantısı .js varsa, npm install --save-dev babel-register ve mocha kullanabilirsiniz - babel-register; --compilers yalnızca bir dosya uzantısı belirtmeniz gerektiğinde gereklidir. "
deneyin yakala-nihayet

1
Sonunda bunu kullanarak "babel":{"presets": ["es2015"]}çalıştırmayı başardım , kaçırdığım son şeydi!
Brandon

Yanıtlar:


81

Babel <6 için

Bu sorunu çözmenin en kolay yolu şudur:

  1. npm install babel-preset-es2015 --save-dev
  2. .babelrcİçeriği olan projenin köküne ekleyin :

    {
     "presets": [ "es2015" ]
    }
    

Mocha'yı "--compilers js: babel-core / register" parametresi ile çalıştırdığınızdan emin olun.

Babel6 / 7 + için

  1. npm install @babel/preset-env --save-dev
  2. .babelrcİçeriği olan projenin köküne ekleyin :

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

--compilers js:babel-register(Babel 6) veya --compilers js:@babel/register(Babel 7) parametresi ile mocha çalıştırdığınızdan emin olun.

Mocha sürüm 7 veya üstü için sırasıyla --require babel-registerveya kullanın --require @babel/register.


27
mocha'yı --require babel-register param ile çalıştırmayı deneyin
kolec

2
@kolec Bu çalışır. Daha da iyisi mocha.opts, / test dizininin kökünde bir dosya oluşturun ve oraya ekleyin
Martin Dawson

4
Bunların hepsi birlikte hala yardımcı olmuyor (komut satırı, mocha.opts değil).
Kev

3
Es2016'yı kullanmak istiyorsanız, Babel'deki es2016'nın "Yalnızca ES2016'dan ES2015'e kadar olanları derlediğini" unutmayın, bu nedenle ön ayarlar dizinizde hem es2016 hem de es2015'e ihtiyacınız vardır
prauchfuss

4
--compilersartık kullanımdan kaldırıldı. Kullanım--requireBunun yerine .
robsch

46

Görünüşe göre tek çözüm, açıkça dahil etmek:

require('babel-core/register')({
  ignore: /node_modules/(?!ProjectB)/
}); 

bir test yardımcı dosyasında ve bunu test komutumdaki mocha'ya iletin:

mocha --require ./test/testHelper.js...

Son çözüm:

RegisterBabel.js ekleyin : işi babel-core / register ... gerektirecek ayrı bir dosya ...

require('babel-core/register')({
  ignore: /node_modules/(?!ProjectB)/
});

Uygulamanız aynı zamanda babel-node'a dayanıyorsa, bir entry.js ekleyin . Bu, es6 içeren uygulamanız için bir sarmalayıcı görevi görür.

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

Daha sonra uygulamanızı şununla çalıştırırsınız: node entry

Mocha testi için testHelper.js , çalışma zamanında babel desteğini başlatmak için registerBabel.js'yi de gerektirmelidir.

require('./registerBabel');

Ve mocha testlerinizi yapın mocha --require ./testHelper.js '+(test)/**/*Spec.js'

Bu, "./test" içinde "Spec.js" ile biten herhangi bir dosyayı özyinelemeli olarak test edecektir. Modeli, projenizdeki özelliklerle eşleşen bir modelle değiştirin.


3
Görünüşe göre ignorenormal ifade biraz yanlış . ignore: /node_modules\/(?!ProjectB)/BabelRegister dosyasının çalışması için node_modules'den hemen sonra kaçan bir ters eğik çizgi eklemek zorunda kaldım . Aksi takdirde harika görünüyor!
hellatan

Bu, gereksinim ifadeleri nedeniyle Rollupify'ı kullanmamıza izin vermez. Required ifadelerini kullanmadan bunu yapmanın bir yolunu biliyor muydunuz?
MikesBarto2002

Bu harika, ancak bunun gibi kod eklemeye izin vermeyen ve dosyalarınızı doğrudan çalıştırmak isteyen araçlar ne olacak? O zaman babel-nodeböyle bir şeyin kullanılmasına izin vermeyen ile sonuçlanırsınız .babelrc.
Evgeny

1
senin müthiş! Babel, sunucuyu çalıştırırken ES6 kodumu işliyordu, ancak mocha testi başarısız olurdu. Cevabınız çözdü. Mocha.opts'ta --compilers'ı denedim ama bu import ifadelerinin başarısız olmasına neden oldu.
Enerjik Pikseller

1
Bunu çalıştıramadım, ama babelrc'mi de genişletmem gerektiği ortaya çıktı: `` required ('@ babel / register') ({extends: './.babelrc', ignore: [/ node_modules \ / (?! ProjeB) /]}); `` `
TiggerToo

26

Eminim bu sorunu yaşayacaksınız, mocha'nın bilmediği ES6 kullanıyorsunuz

Yani babel kullanıyorsun ama testinde kullanmıyorsun ...

Birkaç Çözüm:

A. NPM ile çalıştırıyorsanız

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

B. kullanıyorum

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

C. Cli'den:

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

Daha fazlasını http://www.pauleveritt.org/articles/pylyglot/es6_imports/ adresinde okuyabilirsiniz.


1
çok teşekkür ederim! --Compilers js: babel-core / register seçeneğini
kaçırıyordum

1
Bunu zaten yapıyordum ... ilk soruyu okudun mu?
ThinkingInBits

1
@ThinkingInBits Sonunda ne kullandınız, sorunu nasıl çözdünüz (çözdüyseniz)? Burada ciddi sorun yaşıyorum, bu seçeneklerin çoğunu denedim
Milan Velebit

--compilersşu anda kullanımdan kaldırıldı, görünüşe göre --requiregüvenli olan tek seçenek
Ali Ghanavatian

23

Ben de aynı sorunla karşılaştım. Stackoverflow ve ötesinde diğer tüm çözümleri denedikten sonra bu basit yapılandırmayı package.json'a eklemek benim için yaptı:

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

Tüm ES6 ithalatlarım bundan sonra çalıştı. Bu arada, webpack.config.js içinde de aynı yapılandırmaya sahiptim, ancak görünüşe göre mocha testi için de çalışmasını sağlamanın tek yolu buydu.

Umarım bu birine yardımcı olur.


yanlış yazılmış bir .babelrc dosyam vardı, bu yüzden başlangıçta çalışmıyordu. Bu çözüm işe yarıyor ve önerilen çözümdür. Projenizde bir .babelrc dosyası oluşturun ve {"ön ayarlar": ["es2015"]}
AfDev

14

Ben {"modules": false}şöyle, benim .babelrc dosyasında:

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

hangisi atıyordu

Beklenmeyen jeton içe aktarma

Kaldırdıktan sonra mocha başarıyla koştu.


Bu, Webpacker for Rails tarafından oluşturuldu: `` "" ön ayarlar ": [[" env ", {" modüller ": yanlış," hedefler ": {" tarayıcılar ":">% 1 "," uglify ": ​​doğru}, "useBuiltIns": true}], "tepki" `` `` Modüller satırını kaldırdıktan sonra benim için çalıştı.
emptywalls

Bu, CircleCI jest birim testlerimi çalıştıramadığında ve bana beklenmedik belirteç içe aktarma hatası verdiğinde sorunumu çözdü. +1!
Candlejack

Bu benim için yaptı. Rails, Webpacker, vb ... Teşekkürler!
emptywalls

8

Aynı sorunu yaşadım ve Babel'i Mocha ile entegre etmek için babel belgelerini okuyarak düzelttim :

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

Mocha ve Babel'in hangi versiyonu için?
Ognyan Dimitrov

Benim Babel versiyonlarıdır 6.26.0hariç "babel-preset-env": "1.6.0"ve "mocha": "3.5.3"
bhantol

Garip. Bu benim sorunumu çözdü ve benim durumumda saf bir belge okuma sorunuydu.
Ognyan Dimitrov

6

Babel 7 ve Mocha 4 kullanan herkes için bazı paket isimleri biraz değişti ve kabul edilen cevap biraz modası geçmiş durumda. Yapmam gereken şey şuydu:

npm install @babel/register --saveDev

ve --require @babel/registertest satırına eklemepackage.json

"test": "./node_modules/mocha/bin/mocha --require @babel/polyfill --require @babel/register './test/**/*.spec.js'"

@babel/polyfillDüzeltmeleri zaman uyumsuz / bekliyoruz işlevselliği gibi bazı şeyler o kullanıyor için gerçekleşmesi durumunda.

Umarım birine yardımcı olur :)


4

Haziran 19 itibarıyla geçerli olan başka bir ES6 + mocha + babel yapılandırma cevabını buraya ekliyorum (answer / commente üzerindeki tarihlere bakın). mocha --compilerbayrağı kullanımdan kaldırdı ve benim kullandığım sürüm, --no-deprecationbayrakla bile kullanılamıyor , cf bu

Bağlantılı sayfalardaki ilgili tüm bitleri dahil etmeyeceğimi unutmayın, çünkü hiçbiri beni mocha ve babel'in en son sürümlerine dayalı temiz bir test yapısına götürmedi; bu cevap, beni başarılı bir test yapısına götüren adımları içermelidir.

Buradaki talimatları izleyerek ve bu cevapta ve burada , aşağıdakileri kullanarak minimum son babel gibi görünen şeyi yüklemeyi denedim npm install:

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

Ve package.json'daki mocha çağrısını şu şekilde ayarladım:

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

Bu, hatalara yol açtı:

× ERROR: --compilers is DEPRECATED and no longer supported.

Yukarıdaki gibi, --no-deprecationyardımcı olmadım, lütfen yukarıda bağlantısı verilen sayfaya bakın. Dan talimatları izleyerek Yani burada ben package.json ayarlanabilir:

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

Ve babel modüllerini bulmayla ilgili aşağıdaki gibi hatalar görmeye başladı:

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

Bu noktada ilerleyene kadar babel paketlerini kurmaya başladım. Tam yüklemenin şöyle bir şey olduğuna inanıyorum:

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

Gereken son değişiklik, js:öneki kaldırarak package.json'daki mocha çağrısını güncellemekti, şöyle:

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

Bunun neden gerekli olduğunu cevaplayamıyorum: Birisi buna cevap verebilirse lütfen bir yorum bırakın ve cevabımı daha iyi bilgilerle güncelleyeceğim.

Yaptığım son şey, proje dizininde içeriğiyle bir .babelrc oluşturmaktı:

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

Buna neyin yol açtığını hatırlayamıyorum, ancak bunun mocha'nın test.js'deki anahtar kelimeyi tanımadığı için şikayet etmeye devam ettiğine inanıyorum . importYukarıdaki gibi, birisi buna cevap verebilirse lütfen bir yorum bırakın ve cevabımı daha iyi bilgilerle güncelleyeceğim.


Bu noktada mocha testlerimi başarıyla yapabilirim. Buradaki bilgilerimde eksiklikler olduğunun farkındayım: Çok sayıda üretim javascript kodu yazdım ama göreceli bir node noob'um. Cevaba eklemek için bunu daha fazlasını gören herkes, lütfen bir yorum bırakın ve ben cevabı iyileştireceğim, YA DA kendi daha iyi cevabınızı bırakın.
pb2q

3

--compilers kullanımdan kaldırıldı.

Benim basit çözümüm:

npm install --save-dev babel-core

Ve package.json içinde test komut dosyanızı şu şekilde ekleyin:

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

2

Babel 6.XX ile yapmanın en kolay yolunu nyc kullanmak ve daha sonra helper içine dosyasıpckage.json

İşte kullandım

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')();

Artık es6'yı testlerinizde veya ihtiyacınız olan her yerde kullanabileceksiniz. Benimkiler başarısız oluyor;)

Sonra npm run testhangisi ateşleneceknyc mocha --reporter tap 'test/**/*.spec.js'


2

İşte benim için ne işe yaradı. --compilersBayrağı kullanırken bir uyarı aldım .

DeprecationWarning: "--compilers", Mocha'nın gelecekteki bir sürümünde kaldırılacaktır; Daha fazla bilgi için https://git.io/vdcSr bakın

Bu yüzden onu --requirebayrakla değiştirdim

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

İşte benim .babelrc:

{
  "presets": ["env"]
}

Benim package.jsondev bağımlılıkları

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

2

Bu sorunu bu sabah aşağıdaki talimatlarla çözdüm

NPM Modüllerini Kurun

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

Bu sorunu bu sabah Mocha 4 için Babel kullanma resmi talimatlarındaki aşağıdaki talimatlarla çözdüm:

NPM Modüllerini Kurun

npm install --save-dev babel-polyfill
npm install --save-dev babel-preset-env
npm install --save-dev babel-register

veya tek bir komut:

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

mochaKodumda kullandığımda aynı hatayı kurdum ve karşılaştım import. Aşağıdaki işlemleri yaparak sorun giderildi.

npm install babel-core --save-dev
npm install babel-preset-es2015 --save-dev
npm install babel-preset-stage-0 --save-dev

Ve sonra bir .babelrcdosya ekleyin :

{
    "presets": [
        "es2015"
    ]
}

Ve sonra mochaşu şekilde çalıştırın :

mocha --compilers js:babel-core/register

-1

Ben de aynı sorunu yaşadım. Testleri çalıştırırken, aslında bağımlı modülleri saplamak istediğimi fark ettim. Birim testi için iyidir ve babel'in alt modülleri dönüştürmesini önler. Ben de kullandım proxyquire:

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

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

Bu bir yorum olarak daha uygun.
Gajus

-3

daha geleceğe yönelik bir ayar için

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

ve .babelrc içinde

{
  "presets": [ "latest" ]
}

aksine...

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

ve

{
 "presets": [ "es2015" ]
}

2
Sanırım bu cevap pratikte bu soruyla ilgili değil .. veya daha doğrusu başka bir cevaba yorum olarak eklenebilir
62mkv

@ 62mkv Teşekkürler! Şahin olmanın ve burayı temiz tutmanın yolu.
Phil Henry Mcboob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.