Nhập mã thông báo không mong muốn của Babel khi chạy thử nghiệm mocha


92

Các giải pháp được cung cấp trong các câu hỏi liên quan khác, chẳng hạn như bao gồm các giá trị đặt trước thích hợp (es2015) trong .babelrc, đã được triển khai trong dự án của tôi.

Tôi có hai dự án (hãy gọi chúng là A và B), cả hai đều sử dụng cú pháp mô-đun ES6. Trong Dự án A, tôi đang nhập Dự án B được cài đặt qua npm và nằm trong thư mục node_modules. Khi tôi chạy bộ thử nghiệm của mình cho Dự án A, tôi gặp lỗi:

SyntaxError: Nhập mã thông báo không mong muốn

Trước dòng mã bị cáo buộc có lỗi này từ Dự án B:

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

Iife dường như là thứ gì đó liên quan đến npm hoặc có thể liên quan đến babel vì tệp nguồn của tôi chỉ chứa "import createBrowserHistory từ 'history / lib / createBrowserHistory'; Đơn vị thử nghiệm trong bộ thử nghiệm của Dự án B chạy tốt và nếu tôi xóa Dự án B như một phần phụ thuộc từ Dự án A, bộ thử nghiệm của tôi sau đó (vẫn sử dụng nhập es6 cho các mô-đun dự án nội bộ) hoạt động tốt.

Theo dõi toàn bộ ngăn xếp:

 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

Đây là lệnh thử nghiệm của tôi từ package.json:

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

Bài đăng trên StackOverflow này tương tự nhưng không đưa ra giải pháp cho việc sử dụng dòng lệnh của tôi: nhập mô-đun từ node_modules bằng babel nhưng không thành công


1
Nếu bạn đang phân phối một mô-đun trên npm, bạn chỉ nên phân phối phiên bản đã chuyển đổi của mô-đun đó.
loganfsmyth

Dự án này rất nhẹ. Nó được thiết kế chủ yếu cho mục đích sử dụng của riêng tôi hoặc những người khác nếu họ có quy trình thoát hơi nước có thể hỗ trợ nó. Tôi đang cố gắng đạt được "vani es6" trong các phụ thuộc này.
ThinkingInBits

2
Tôi nghĩ rằng bạn quên định cấu hình babel trong package.json. thêm những thứ đó vào package của bạn.json "babel": {"presets": ["es2015"]}
Jacob

3
Lưu ý: theo tài liệu --compilers là không cần thiết, --require babel-registernên dùng thay thế: "Nếu mô-đun ES6 của bạn có đuôi mở rộng .js, bạn có thể cài đặt npm --save-dev babel-register và sử dụng mocha --require babel-register; --compilers chỉ cần thiết nếu bạn cần chỉ định phần mở rộng tệp. "
try-catch-cuối cùng,

1
Cuối cùng tôi đã có thể làm cho nó hoạt động bằng cách sử dụng "babel":{"presets": ["es2015"]}nó là thứ cuối cùng tôi còn thiếu!
Brandon

Câu trả lời:


79

Dành cho Babel <6

Cách dễ nhất để giải quyết vấn đề này là:

  1. npm install babel-preset-es2015 --save-dev
  2. Thêm .babelrcvào thư mục gốc của dự án với nội dung:

    {
     "presets": [ "es2015" ]
    }
    

Đảm bảo rằng bạn đang chạy mocha với tham số "--compilers js: babel-core / register".

Dành cho Babel6 / 7 +

  1. npm install @babel/preset-env --save-dev
  2. Thêm .babelrcvào thư mục gốc của dự án với nội dung:

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

Đảm bảo rằng bạn đang chạy mocha với tham số --compilers js:babel-register(Babel 6) hoặc --compilers js:@babel/register(Babel 7)

Đối với phiên bản mocha 7 trở lên, sử dụng --require babel-registerhoặc --require @babel/registertương ứng.


27
thử chạy mocha với --require babel-register param
kolec

2
@kolec Điều này hoạt động. Thậm chí tốt hơn, mặc dù tạo ra một mocha.optstập tin trong thư mục gốc của thư mục test / và thêm nó ở đó
Martin Dawson

3
Tất cả những điều này kết hợp với nhau vẫn không giúp ích gì (dòng lệnh, không phải mocha.opts).
Kev

3
Nếu bạn muốn sử dụng es2016, hãy ghi nhớ rằng es2016 trong Babel "Chỉ biên dịch những gì trong ES2016 để ES2015" vì vậy bạn cần cả hai es2016 và es2015 trong mảng cài đặt trước của bạn
prauchfuss

4
--compilershiện không được dùng nữa. Sử dụng --requirethay thế.
cướp

46

Có vẻ như giải pháp duy nhất là bao gồm rõ ràng:

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

trong tệp trình trợ giúp kiểm tra và chuyển nó đến mocha trong lệnh kiểm tra của tôi:

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

Giải pháp cuối cùng:

Thêm registerBabel.js : một tệp riêng biệt có công việc là yêu cầu babel-core / register ...

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

Thêm một entry.js nếu ứng dụng của bạn cũng dựa vào babel-node. Điều này hoạt động như một trình bao bọc cho ứng dụng chứa es6 của bạn.

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

Sau đó, bạn sẽ chạy ứng dụng của mình với node entry

Đối với thử nghiệm mocha, testHelper.js cũng phải yêu cầu registerBabel.js để khởi tạo hỗ trợ babel tại thời điểm chạy.

require('./registerBabel');

Và chạy thử nghiệm mocha của bạn với mocha --require ./testHelper.js '+(test)/**/*Spec.js'

Điều này sẽ kiểm tra đệ quy bất kỳ tệp nào kết thúc bằng "Spec.js" trong "./test". Thay thế mẫu bằng một mẫu phù hợp với thông số kỹ thuật trong dự án của bạn.


3
Có vẻ như ignoreregex là một chút tắt. Tôi đã phải thêm một dấu gạch chéo ngược thoát ngay sau node_modules: ignore: /node_modules\/(?!ProjectB)/để tệp babelRegister hoạt động. Nếu không có vẻ tuyệt vời!
hellatan

Điều này không cho phép chúng tôi sử dụng Rollupify vì các câu lệnh yêu cầu. Bạn có biết cách thực hiện điều này mà không cần sử dụng câu lệnh request không?
MikesBarto2002

Điều này thật tuyệt, nhưng còn những công cụ không cho phép thêm mã như thế này và muốn chạy các tệp của bạn trực tiếp. Sau đó, bạn kết thúc với babel-nodeđiều đó không cho phép một thứ như vậy sử dụng .babelrc.
Evgeny

1
tuyệt vời của bạn! Babel đang xử lý mã ES6 của tôi khi vừa chạy máy chủ, nhưng thử nghiệm mocha sẽ không thành công. Câu trả lời của bạn đã giải quyết nó. Tôi đã thử --compilers trong mocha.opts nhưng điều đó khiến báo cáo nhập không thành công.
ảnh tràn đầy năng lượng.

1
Tôi không thể làm cho điều này hoạt động, nhưng hóa ra tôi cũng cần mở rộng babelrc của mình: `` `` request ('@ babel / register') ({expand: './.babelrc', ignore: [/ node_modules \ / (?! ProjectB) /]}); ``
TiggerToo

26

Chắc chắn bạn sẽ gặp vấn đề đó, bạn đang sử dụng ES6 mà mocha không biết

Vì vậy, bạn đang sử dụng babel nhưng bạn không sử dụng nó trong thử nghiệm của mình ...

Một số giải pháp:

A. nếu bạn chạy với sử dụng NPM

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

B. Tôi đang sử dụng

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

C. Từ cli:

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

Bạn có thể đọc thêm tại http://www.pauleveritt.org/articles/pylyglot/es6_imports/


1
cảm ơn bạn rất nhiều! Tôi đã bỏ lỡ --compilers js: babel-core / tùy chọn đăng ký
mycargus

1
Tôi đã làm điều này ... bạn thậm chí đã đọc câu hỏi ban đầu?
ThinkingInBits

1
@ThinkingInBits Bạn đã sử dụng gì, bạn (nếu có) giải quyết vấn đề như thế nào? Tôi đang gặp rắc rối nghiêm trọng ở đây, cố gắng hầu hết các tùy chọn
Milan Velebit

--compilersbị phản đối bây giờ, trông giống như --requirelà lựa chọn an toàn duy nhất để đi
Ali Ghanavatian

23

Tôi đã gặp phải vấn đề tương tự. Đã thử mọi giải pháp khác trên stackoverflow và hơn thế nữa, việc thêm cấu hình đơn giản này trên package.json đã giúp tôi:

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

Tất cả các lần nhập ES6 của tôi đều hoạt động sau đó. Nhân tiện, tôi có cùng cấu hình này bên trong webpack.config.js, nhưng rõ ràng đây là cách duy nhất để làm cho nó hoạt động cho cả thử nghiệm mocha.

Hy vọng điều này sẽ giúp ai đó.


tôi có một tệp .babelrc viết sai chính tả, vì vậy nó không hoạt động ban đầu. Giải pháp này hoạt động và là giải pháp được khuyến nghị. Tạo một file .babelrc trong dự án của bạn và thêm { "cài đặt trước": [ "es2015"]}
AfDev

14

Tôi đã có {"modules": false}trong tệp .babelrc của mình, như vậy:

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

đang ném

Nhập mã thông báo không mong muốn

Sau khi tôi xóa nó, mocha đã chạy thành công.


Điều này được tạo bởi Webpacker cho Rails: `` `" presets ": [[" env ", {" modules ": false," target ": {" browser ":"> 1% "," uglify ": ​​true}, "useBuiltIns": true}], "react" `` `Sau khi tôi xóa dòng mô-đun, nó đã hoạt động với tôi.
blankwalls

Điều này đã giải quyết được sự cố của tôi khi CircleCI không chạy thử nghiệm đơn vị jest của tôi và gây cho tôi lỗi nhập mã thông báo không mong muốn. +1!
Candlejack

Điều này đã làm điều đó cho tôi. Rails, Webpacker, v.v. Cảm ơn!
blankwalls

8

Tôi đã gặp vấn đề tương tự và đã khắc phục nó bằng cách đọc từ tài liệu babel để tích hợp Babel với Mocha:

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

Đối với phiên bản Mocha và Babel nào?
Ognyan Dimitrov

Phiên bản Babel của tôi là 6.26.0trừ "babel-preset-env": "1.6.0""mocha": "3.5.3"
bhantol

Thật kỳ lạ. Điều này đã giải quyết được vấn đề của tôi và là vấn đề thuần túy về read-the-doc trong trường hợp của tôi.
Ognyan Dimitrov

6

Đối với bất kỳ ai sử dụng Babel 7 và Mocha 4, một số tên gói đã thay đổi một chút và câu trả lời được chấp nhận là hơi lỗi thời. Những gì tôi phải làm là:

npm install @babel/register --saveDev

và thêm --require @babel/registervào dòng kiểm tra trongpackage.json

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

Các @babel/polyfillbản sửa lỗi một số thứ như chức năng async / await nếu bạn tình cờ sử dụng chúng.

Hy vọng điều đó sẽ giúp ai đó :)


3

--compilers không được dùng nữa.

Giải pháp đơn giản của tôi:

npm install --save-dev babel-core

Và trong package.json, hãy thêm tập lệnh thử nghiệm của bạn như sau:

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

3

Tôi đang thêm một câu trả lời cấu hình ES6 + mocha + babel khác ở đây, hiện tại kể từ tháng 6 năm 19 (tham khảo ngày trên answer / commente). mocha đã không dùng --compilercờ nữa và phiên bản tôi đang sử dụng không có sẵn ngay cả với --no-deprecationcờ, xem điều này

Lưu ý rằng tôi sẽ không bao gồm tất cả các bit có liên quan từ các trang được liên kết, vì không có trang nào đưa tôi đến bản dựng thử nghiệm sạch sẽ dựa trên các phiên bản mới nhất của mocha và babel; câu trả lời này phải bao gồm các bước giúp tôi xây dựng thử nghiệm thành công.

Làm theo hướng dẫn ở đây, và trong câu trả lời này , và ở đây , tôi đã thử cài đặt những gì có vẻ là babel mới nhất tối thiểu bằng cách sử dụng npm install:

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

Và tôi đã điều chỉnh lời gọi mocha trong package.json, như sau:

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

Điều này dẫn đến lỗi:

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

Như trên, --no-deprecationkhông hữu ích, vui lòng tham khảo trang được liên kết ở trên. Vì vậy, làm theo hướng dẫn từ đây, tôi đã điều chỉnh package.json:

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

Và bắt đầu thấy lỗi về định vị mô-đun babel, chẳng hạn như:

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

Tại thời điểm này, tôi bắt đầu cài đặt các gói babel cho đến khi tôi có thể tiến bộ. Tôi tin rằng cài đặt đầy đủ là một cái gì đó giống như:

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

Thay đổi cuối cùng được yêu cầu là cập nhật lời gọi mocha trong package.json, xóa js:tiền tố, như sau:

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

Tôi không thể trả lời tại sao điều này lại cần thiết: nếu ai đó có thể trả lời điều này, vui lòng để lại nhận xét và tôi sẽ cập nhật câu trả lời của mình với thông tin tốt hơn.

Điều cuối cùng mà tôi đã làm là tạo .babelrc trong thư mục dự án, với nội dung:

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

Tôi không thể nhớ điều gì đã dẫn đến điều này, nhưng tôi tin rằng đó là do mocha tiếp tục phàn nàn về việc không nhận ra importtừ khóa trong test.js của tôi. Như trên, nếu ai đó có thể trả lời điều này, vui lòng để lại bình luận và tôi sẽ cập nhật câu trả lời của mình với thông tin tốt hơn.


Tại thời điểm này, tôi có thể chạy thử nghiệm mocha của mình thành công. Tôi nhận ra rằng có những lỗ hổng trong kiến ​​thức của tôi ở đây: Tôi đã viết rất nhiều mã javascript sản xuất nhưng tôi là một noob nút tương đối. Bất kỳ ai thấy điều này với nhiều thứ khác để thêm vào câu trả lời, vui lòng để lại nhận xét và tôi sẽ cải thiện câu trả lời, HOẶC để lại câu trả lời tốt hơn của riêng bạn.
pb2q

2

Tôi thấy cách dễ nhất để làm với babel 6.XX là sử dụng nyc và sau đó thêm một helpertệp vàopckage.json

Vì vậy, đây là những gì tôi đã sử dụng

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

Bây giờ bạn sẽ có thể sử dụng es6 trong các bài kiểm tra của mình hoặc bất cứ nơi nào bạn cần. Của tôi đều thất bại;)

Sau đó, npm run testcái nào sẽ tắtnyc mocha --reporter tap 'test/**/*.spec.js'


2

Đây là những gì làm việc cho tôi. Tôi đã nhận được cảnh báo khi sử dụng --compilerscờ.

DeprecationWarning: "--compilers" sẽ bị xóa trong phiên bản Mocha trong tương lai; xem https://git.io/vdcSr để biết thêm thông tin

Do đó tôi đã thay thế nó bằng --requirelá cờ

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

Đây là của tôi .babelrc:

{
  "presets": ["env"]
}

package.jsonPhụ thuộc nhà phát triển của tôi

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

2

Tôi đã giải quyết vấn đề này vào sáng nay bằng các hướng dẫn sau

Cài đặt mô-đun 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

Tôi đã giải quyết vấn đề này vào sáng nay bằng các hướng dẫn sau từ hướng dẫn Sử dụng Babel chính thức cho Mocha 4:

Cài đặt mô-đun NPM

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

hoặc một lệnh duy nhất:

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

Tôi đã cài đặt mochavà gặp lỗi tương tự khi tôi sử dụng importtrong mã của mình. Bằng cách thực hiện các tác vụ sau, sự cố đã được khắc phục.

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

Và sau đó thêm một .babelrctệp:

{
    "presets": [
        "es2015"
    ]
}

Và sau đó chạy mochatheo cách này:

mocha --compilers js:babel-core/register

-1

Tôi đã từng gặp vấn đề tương tự. Khi chạy các bài kiểm tra, tôi nhận ra rằng tôi thực sự muốn khai thác các mô-đun phụ thuộc. Nó tốt cho việc kiểm tra đơn vị và ngăn chặn babel chuyển đổi mô-đun con. Vì vậy, tôi đã sử dụng proxyquire, cụ thể là:

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

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

Điều này phù hợp hơn như một bình luận.
Gajus

-3

để có thêm một thiết lập bằng chứng trong tương lai

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

và trong .babelrc

{
  "presets": [ "latest" ]
}

như trái ngược với...

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

{
 "presets": [ "es2015" ]
}

2
Tôi đoán câu trả lời này là thực tế không liên quan đến câu hỏi này .. hay đúng hơn, nó có thể được thêm vào như là một bình luận cho một câu trả lời
62mkv

@ 62mkv Cảm ơn! Cách trở thành diều hâu và giữ cho nơi này sạch sẽ.
Phil Henry Mcboob
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.