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

时间:2016-11-03 11:03:02

标签: javascript angular phantomjs karma-runner karma-jasmine

Angular,JS有一个单元测试实现。测试不是我创造的。测试是使用Jasmine构建的,并在PhantomJS上与Karma一起运行。

问题是该测试会打开Chrome,执行某项操作并关闭浏览器。现在我想更改此实现,不要使用Chrome,而是使用PhantomJs以便不打开浏览器。

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

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

现在,当我运行测试时,我得到了下一个异常:

> 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.

第31行如下:.then(()=> Promise.all([

我真的不知道Node.JS.任何想法是什么原因导致这个问题,以及如何解决?

1 个答案:

答案 0 :(得分:0)

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

第31行如下:.then(() => Promise.all([

您最有可能使用箭头功能。 Chrome支持它,但可能不支持PhantomJS。只需将其更改为使用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) {
     ...
  })