Использование зарезервированного слова "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'
    ],
    ....
  });
};
Другие вопросы по тегам