Использование зарезервированного слова "let" при выполнении тестов
Начал получать эту ошибку, которую я просто не могу исправить, при запуске моих тестов.
09 04 2017 22:08:20.577:INFO [karma]: Karma v1.6.0 server started at http://0.0.0.0:9876/
09 04 2017 22:08:20.580:INFO [launcher]: Launching browser PhantomJS with unlimited concurrency
09 04 2017 22:08:20.602:INFO [launcher]: Starting browser PhantomJS
09 04 2017 22:08:23.661:INFO [PhantomJS 2.1.1 (Windows 8 0.0.0)]: Connected on socket SPM1D8Mj1w6ABbGuAAAA with id 7910462
PhantomJS 2.1.1 (Windows 8 0.0.0) ERROR
SyntaxError: Use of reserved word 'let' in strict mode
at test/browser/index.js:886
Я считаю, что это произошло во время обновления некоторых пакетов.
Мой конфиг кармы выглядит так:
require('babel-register');
const webpack = require('../webpack.config.babel.js');
module.exports = function(config) {
config.set({
basePath: '../',
frameworks: ['mocha', 'chai-sinon'],
browsers: ['PhantomJS'],
files: ['test/browser/**/*.js'],
preprocessors: {
'test/**/*.js': ['webpack'],
'src/**/*.js': ['webpack']
},
webpack,
webpackMiddleware: { noInfo: true }
});
};
Тесты довольно простые
import { h, render, rerender } from 'preact';
import { route } from 'preact-router';
import App from '../../src/components/app';
/*global sinon,expect*/
describe('App', () => {
var scratch;
before(() => {
scratch = document.createElement('div');
(document.body || document.documentElement).appendChild(scratch);
});
beforeEach(() => {
scratch.innerHTML = '';
});
after(() => {
scratch.parentNode.removeChild(scratch);
});
describe('routing', () => {
it('should render the homepage', () => {
render(<App />, scratch);
expect(scratch.innerHTML).not.contain('Home');
});
it('should render the header', () => {
render(<App />, scratch);
expect(scratch.innerHTML).to.contain('header');
});
it('should render the footer', () => {
render(<App />, scratch);
expect(scratch.innerHTML).to.contain('footer');
});
it('should render the social media links', () => {
render(<App />, scratch);
expect(scratch.innerHTML).to.contain('a');
});
});
});
Любая идея, где я мог бы даже узнать, о чем "пусть" это говорит?
Я запускаю это на Node v7.8.0
4 ответа
Проблема зависит от браузера. Итак, если вы не используете Babel для компиляции исходного кода в ES5, то тесты просто не будут выполняться в PhantomJS. Webpack обрабатывает компиляцию на лету. Поскольку я не вижу источника вашего файла конфигурации Webpack, я предполагаю, что проблема заключается в значении свойства в "webpack.config.babel.js".
Я просто столкнулся с подобной проблемой. Согласно ответу @STEEL, установив npm install karma-chrome-launcher
и изменив браузер на ChromeHeadless, я смог запустить тесты. Однако я обнаружил, что причина, по которой Chrome работал, а PhantomJS - нет, заключалась в том, что в моем файле babel.config.js был Chrome, а не PhantomJS, поэтому Карма неправильно передавалась в PhantomJS. Как только я добавил PhantomJS в список целей в моих пресетах babel, он правильно скомпилировался. Вот то, что мой babel.config.js
файл выглядит так:
const presets = [
["@babel/env", {
targets: {
edge: "17",
firefox: "60",
chrome: "67",
safari: "11.1",
phantomjs: "2.1.1"
},
useBuiltIns: "usage"
}]
];
module.exports = { presets };
Моя конфигурация не загружает настройки из файла конфигурации веб-пакета. Вместо этого он устанавливает конфигурацию webpack внутри karma.config.js, используя следующее поле:
webpack: {
module: {
rules: [
{ test: /\.js/, exclude: /node_modules/, loader: 'babel-loader' }
]
},
watch: true,
mode: 'none'
},
Я также столкнулся с той же проблемой с Ubuntu Linux при запуске теста Karma. Проблема была с полем браузера внутри конфига кармы.
я имел Chrome
позже попробовал PhantomJS
, Но в итоге обнаружил, что использование Chromeheadless в Linux работает и решает проблему. Так как машина, на которой запущен только консольный вид, не может запускать ничего, кроме приложения без монитора.
использовать Chromeheadless
browsers: ['ChromeHeadless'],
Кроме того, если у вас все еще есть проблемы, попробуйте flags: ['--no-sandbox'],
внутри вашего karma.conf.js
Это может решить вашу проблему. Вам нужно добавить babel-polyfill
а также phantomjs-polyfill
в вашем файле кармы как
module.exports = function(config) {
config.set({
....
files: [
'./node_modules/babel-polyfill/dist/polyfill.js',
'./node_modules/phantomjs-polyfill/bind-polyfill.js',
'test/browser/**/*.js'
],
....
});
};