使用保留字'让'在运行测试时

时间:2017-04-09 21:11:35

标签: reactjs mocha karma-runner preact

在运行我的测试时,我似乎无法修复此错误。

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

我相信在某些软件包更新过程中会发生这种情况。

我的Karma配置如下所示:

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

任何想法,我甚至可以找出哪些&#34;让&#34;它在说什么?

我在Node v7.8.0上运行它

4 个答案:

答案 0 :(得分:1)

问题是浏览器特定的。因此,如果您没有使用Babel将源代码编译为ES5,那么测试就不会在PhantomJS中运行。 Webpack即时处理编译。由于我看不到Webpack配置文件的来源,我猜测问题是“webpack.config.babel.js”中的属性值。

答案 1 :(得分:0)

在运行Karma测试时,我也遇到了与Ubuntu Linux相同的问题。 问题在于karma config中的 browsers 字段。

我有Chrome,之后我尝试PhantomJS。但最终发现在Linux上使用“Chromeheadless”并解决了这个问题。由于只运行控制台视图的计算机无法运行除无头应用程序之外的其他任何内容。

使用Chromeheadless

browsers: ['ChromeHeadless'],

此外,如果您仍遇到问题,请在flags: ['--no-sandbox'],

中尝试karma.conf.js

答案 2 :(得分:0)

我只是遇到了类似的问题。按照@STEEL的回答,通过安装onChange?: (...args: any[]) => any; 并将浏览器更改为ChromeHeadless,我可以运行测试。但是,我发现Chrome无法运行,而PhantomJS无法运行的原因,是因为我在babel.config.js文件中安装了Chrome,但没有PhantomJS,因此Karma没有正确地转换为PhantomJS。将PhantomJS添加到babel预设中的目标列表后,即可正确编译。这是我的npm install karma-chrome-launcher文件的样子:

babel.config.js

我的配置未从Webpack配置文件加载设置。而是使用以下字段在karma.config.js中设置webpack的配置:

const presets = [
  ["@babel/env", {
    targets: {
      edge: "17",
      firefox: "60",
      chrome: "67",
      safari: "11.1",
      phantomjs: "2.1.1"
    },
    useBuiltIns: "usage"
  }]
];

module.exports = { presets };

答案 3 :(得分:-1)

这可能会解决您的问题。 您需要在您的业力文件中添加babel-polyfillphantomjs-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'
    ],
    ....
  });
};