简体   繁体   English

在PhantomJS上运行时,Karma测试失败

[英]Karma test fails when running on PhantomJS

There is a unit test implementation for Angular, JS. 有一个Angular,JS的单元测试实现。 The test wasn't created by me. 测试不是我创造的。 The test is build using Jasmine and runs with Karma on PhantomJS. 测试是使用Jasmine构建的,并在PhantomJS上与Karma一起运行。

The problem is that the test opens the Chrome, does something and close the browser. 问题是该测试会打开Chrome,执行某些操作并关闭浏览器。 Now I want to change this implementation not to use Chrome, but PhantomJs in order to not open the browser. 现在我想改变这个实现不是为了使用Chrome,而是为了不打开浏览器而使用PhantomJs。

The karma.conf.js file looks like: karma.conf.js文件如下所示:

  module.exports = function(config) {

  var appBase   = 'app/';      // transpiled app JS files
  var appAssets ='/base/app/'; // component assets fetched by Angular's compiler

  config.set({
    basePath: '',
    frameworks: ['jasmine'],
    plugins: [
      require('karma-jasmine'),
//      require('karma-chrome-launcher'),
      require('karma-htmlfile-reporter'),
      require('karma-phantomjs-launcher')
    ],

    customLaunchers: {
      expletiveRedacted: {
        base: 'PhantomJS',
        options: {
          windowName: 'my-window',
          settings: {
            webSecurityEnabled: false
          },
        },
        flags: ['--load-images=true'],
        debug: true
      },

//    phantomjsLauncher: {
//      // Have phantomjs exit if a ResourceError is encountered (useful if karma exits without killing phantom)
//      exitOnResourceError: true
//    }
  },

//    customLaunchers: {
//      // From the CLI. Not used here but interesting
//      // chrome setup for travis CI using chromium
//      Chrome_travis_ci: {
//        base: 'Chrome',
//        flags: ['--no-sandbox']
//      }
//    },
    files: [
      // System.js for module loading
      'node_modules/systemjs/dist/system.src.js',
      'node_modules/systemjs/dist/system-polyfills.js',

      // Polyfills
      'node_modules/core-js/client/shim.js',

      // Reflect and Zone.js
      'node_modules/reflect-metadata/Reflect.js',
      'node_modules/zone.js/dist/zone.js',
      'node_modules/zone.js/dist/long-stack-trace-zone.js',
      'node_modules/zone.js/dist/proxy.js',
      'node_modules/zone.js/dist/sync-test.js',
      'node_modules/zone.js/dist/jasmine-patch.js',
      'node_modules/zone.js/dist/async-test.js',
      'node_modules/zone.js/dist/fake-async-test.js',

      // RxJs.
      { pattern: 'node_modules/rxjs/**/*.js', included: false, watched: false },
      { pattern: 'node_modules/rxjs/**/*.js.map', included: false, watched: false },

      // Angular 2 itself and the testing library
      {pattern: 'node_modules/@angular/**/*.js', included: false, watched: false},
      {pattern: 'node_modules/@angular/**/*.js.map', included: false, watched: false},

      {pattern: 'systemjs.config.js', included: false, watched: false},
//      'karma-test-shim.js',
      {pattern: "karma-test-shim.js", watched: false},

      // transpiled application & spec code paths loaded via module imports
      {pattern: appBase + '**/*.js', included: false, watched: true},

      // asset (HTML & CSS) paths loaded via Angular's component compiler
      // (these paths need to be rewritten, see proxies section)
      {pattern: appBase + '**/*.html', included: false, watched: true},
      {pattern: appBase + '**/*.css', included: false, watched: true},

      // paths for debugging with source maps in dev tools
      {pattern: appBase + '**/*.ts', included: false, watched: false},
      {pattern: appBase + '**/*.js.map', included: false, watched: false},

      {pattern: 'node_modules/angular2-notifications/**/*.js', included: false, watched: false},
      {pattern: 'node_modules/angular2-notifications/**/*.js.map', included: false, watched: false}
    ],

    // proxied base paths for loading assets
    proxies: {
      // required for component assets fetched by Angular's compiler
      "/app/": appAssets
    },

    exclude: [],
    preprocessors: {},
    reporters: ['progress', 'html'],

    // HtmlReporter configuration
    htmlReporter: {
      // Open this file to see results in browser
      outputFile: '_test-output/tests.html',

      // Optional
      pageTitle: 'Unit Tests',
      subPageTitle: __dirname
    },

    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['expletiveRedacted'],
    singleRun: true
  })
}

The karma-test-shim.js file: karma-test-shim.js文件:

// /*global jasmine, __karma__, window*/
Error.stackTraceLimit = Infinity;
jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000;

__karma__.loaded = function () {
};

function isJsFile(path) {
  return path.slice(-3) == '.js';
}

function isSpecFile(path) {
  return /\.spec\.js$/.test(path);
}

function isBuiltFile(path) {
  var builtPath = '/base/app/';
  return isJsFile(path) && (path.substr(0, builtPath.length) == builtPath);
}

var allSpecFiles = Object.keys(window.__karma__.files)
  .filter(isSpecFile)
  .filter(isBuiltFile);

System.config({
  baseURL: '/base/app',
  packageWithIndex: true // sadly, we can't use umd packages (yet?)
});

System.import('systemjs.config.js')
  .then(() => Promise.all([
      System.import('@angular/core/testing'),
      System.import('@angular/platform-browser-dynamic/testing')
    ]))
  .then((providers) => {
    var coreTesting = providers[0];
    var browserTesting = providers[1];
    coreTesting.TestBed.initTestEnvironment(
            browserTesting.BrowserDynamicTestingModule,
            browserTesting.platformBrowserDynamicTesting());

  })
  .then(function () {
  // Finally, load all spec files.
  // This will run the tests directly.
  return Promise.all(
    allSpecFiles.map(function (moduleName) {
      return System.import(moduleName);
    }));
  })
  .then(__karma__.start, __karma__.error);

Now when I run the test, I get the next exception: 现在,当我运行测试时,我得到了下一个异常:

> karma start karma.conf.js

03 11 2016 12:31:11.264:INFO [karma]: Karma v1.3.0 server started at http://localhost:9876/
03 11 2016 12:31:11.264:INFO [launcher]: Launching browser expletiveRedacted with unlimited concurrency
03 11 2016 12:31:11.275:INFO [launcher]: Starting browser PhantomJS
03 11 2016 12:31:11.708:INFO [phantomjs.launcher]: ACTION REQUIRED:
03 11 2016 12:31:11.709:INFO [phantomjs.launcher]: 
03 11 2016 12:31:11.709:INFO [phantomjs.launcher]:   Launch browser at
03 11 2016 12:31:11.709:INFO [phantomjs.launcher]:   http://localhost:9000/webkit/inspector/inspector.html?page=2
03 11 2016 12:31:11.709:INFO [phantomjs.launcher]: 
03 11 2016 12:31:11.709:INFO [phantomjs.launcher]: Waiting 15 seconds ...
03 11 2016 12:31:28.639:INFO [PhantomJS 2.1.1 (Windows 8 0.0.0)]: Connected on socket /#7v0Lf6-X3ckgi5xZAAAA with id 33327697
PhantomJS 2.1.1 (Windows 8 0.0.0) ERROR
  SyntaxError: Unexpected token ')'
  at karma-test-shim.js:31


npm ERR! Test failed.  See above for more details.

Line 31 is the following : .then(() => Promise.all([ 第31行如下:.then(()=> Promise.all([

I don't really know Node.JS. 我真的不知道Node.JS. Any ideas what is the cause of this issue and how could it be fixed ? 任何想法是什么原因导致这个问题,以及如何解决?

SyntaxError: Unexpected token ')'
  at karma-test-shim.js:31

Line 31 is the following : .then(() => Promise.all([ 第31行如下: .then(() => Promise.all([

It's most likely your use of the arrow function. 这很可能是你使用箭头功能。 It's supported in Chrome, but probably not PhantomJS. Chrome支持它,但可能不支持PhantomJS。 Just change it to use function instead 只需将其改为使用function

System.import('systemjs.config.js')
  .then(function() { 
     return Promise.all([
       System.import('@angular/core/testing'),
       System.import('@angular/platform-browser-dynamic/testing')
     ]) 
   })
  .then(function(providers) {
     ...
  })

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM