警告[PhantomJS 1.9.8(Mac OS X)]:断开连接(1次),因为10000毫秒内没有消息

vos*_*ssy 6 macos requirejs angularjs karma-jasmine

我的项目是ionic-angularjs-requirejs
我的环境是Mac OS X 10.10.1,节点v0.10.30

我想将karma测试集成到我的项目中,但是当我运行时这是错误的grunt test:

结果:

Running "karma:unit" (karma) task

INFO [karma]: Karma v0.12.28 server started at http://localhost:9876/
INFO [launcher]: Starting browser PhantomJS
INFO [PhantomJS 1.9.8 (Mac OS X)]: Connected on socket UhgMIttDejE4Xdm8I7mG with id 52208731
WARN [PhantomJS 1.9.8 (Mac OS X)]: Disconnected (1 times), because no message in 10000 ms.

Warning: Task "karma:unit" failed. Use --force to continue.

Aborted due to warnings.
Run Code Online (Sandbox Code Playgroud)


这是我的package.json中的依赖项:

"grunt-bower-requirejs": "^1.1.1",
"grunt-contrib-uglify": "^0.2.7",
"grunt-karma": "^0.9.0",
"karma": "^0.12.28",
"karma-jasmine": "^0.3.2",
"karma-phantomjs-launcher": "^0.1.4",
"karma-requirejs": "^0.2.2",
"requirejs": "^2.1.15"
Run Code Online (Sandbox Code Playgroud)

这是我的Gruntfile.js:

module.exports = function (grunt) {

grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    bower: {
        target: {
            rjsConfig: 'js/main.js'
        }
    },
    uglify: {
        options: {
            banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
        },
        build: {
            src: 'src/<%= pkg.name %>.js',
            dest: 'build/<%= pkg.name %>.min.js'
        },
    },
    karma: {
        unit: {
            options: {
                frameworks: ['jasmine', 'requirejs'],
                browsers: ['PhantomJS'],
                autoWatch: true,
                singleRun: true,
                files: [
                    'lib/js/generated/angular/angular.js',
                    'lib/js/generated/angular-mocks/angular-mocks.js',
                    //'js/**/*.js',
                    //'templates/**/*.html',
                    'tests/*.tests.js'
                ],
                exclude: [
                    'js/main.js'
                ]
            }
        }
    }
});

grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-bower-requirejs');
grunt.loadNpmTasks('grunt-karma');

// Tell Grunt what to do when we type "grunt" into the terminal
grunt.registerTask('default', [
    'uglify',
    'bower'
]);
grunt.registerTask('test', [
    'karma'
]);
Run Code Online (Sandbox Code Playgroud)

};

And*_*ing 0

根据我使用 grunt-karma 插件的经验,我花在调试插件上的时间比调试实际站点的时间还要多。我的解决方案是完全避免它并使用 grunt-exec 运行我的 karma 命令,或者只是不使用 grunt 并在新选项卡中手动运行 karma。

grunt.loadNpmTasks('grunt-exec');
var config =
    { 
      exec:   {
        karma : 'karma start {path to your karma.conf.js file}'
        // or 
        // karma : 'karma run {path to your karma.conf.js file}'
      }
    }
Run Code Online (Sandbox Code Playgroud)

我知道这可能不是您正在寻找的答案,但我的经验使我认识到,您从原始程序中获得的每一步都只是您必须调试的附加程序,该程序不是您自己的。

话虽如此,您的文件似乎没有被包含在内。

我通常将 karma 配置文件分成单独的文件:

配置/文件.js

module.exports = [
  'public/lib/angular/angular.js',
  'public/lib/lodash/dist/lodash.compat.js',
  'public/lib/jquery/dist/jquery.js',
  'public/lib/angular-ui-router/release/angular-ui-router.js',
  'tests/test-main.js',
  {pattern: 'public/js/**/*.js', included: true},
  {pattern: 'tests/unit/**/*.js', included: true}
];
Run Code Online (Sandbox Code Playgroud)

配置/common.conf.js

var files = require('./files.js');

module.exports = {

  // base path that will be used to resolve all patterns (eg. files, exclude)
  basePath: '../',

  frameworks: ['jasmine', 'requirejs'],

  // list of files / patterns to load in the browser
  files: files,


  // list of files to exclude
  exclude: [
  ],

  // web server port
  port: 9876,


  // enable / disable colors in the output (reporters and logs)
  colors: true,

  // enable / disable watching file and executing tests whenever any file changes
  autoWatch: true,

  coverageReporter: {
    type : 'html',
    dir : './tests/coverage/',
    subdir: function(browser) {
      "use strict";
      // normalization process to keep a consistent browser name accross different
      // OS
      return browser.toLowerCase().split(/[ /-]/)[0];
    }
  },

};
Run Code Online (Sandbox Code Playgroud)

配置/karma.conf.js

var commonConfig = require('./common.conf.js');

module.exports = function(config) {
  "use strict";
  commonConfig.reporters = ['nyan', 'growl'];
  commonConfig.browsers  = ['PhantomJS'];
  commonConfig.captureTimeout = 60000;
  commonConfig.singleRun = false;
  commonConfig.logLevel  = config.LOG_DEBUG;


  config.set(commonConfig);
};

//    commonConfig.browsers  = ['PhantomJS', 'Chrome']
//    commonConfig.browsers  = ['PhantomJS', 'Chrome', 'Safari', 'Firefox'],
Run Code Online (Sandbox Code Playgroud)

配置/build.conf.js

var commonConfig = require('./common.conf.js');

module.exports = function(config) {
  "use strict";
  commonConfig.reporters = ['progress'];
  commonConfig.browsers  = ['PhantomJS'];
  commonConfig.captureTimeout = 120000;
  commonConfig.singleRun = true;
  commonConfig.logLevel  = config.LOG_DEBUG;
  config.set(commonConfig);
};
Run Code Online (Sandbox Code Playgroud)

配置/test.coverage.js

var commonConfig = require('./common.conf.js');

module.exports = function(config) {
  "use strict";
  commonConfig.reporters = ['progress','coverage'];
  commonConfig.browsers  = ['PhantomJS', 'Chrome', 'Safari', 'Firefox'];
  commonConfig.captureTimeout = 120000;
  commonConfig.singleRun = true;
  commonConfig.logLevel  = config.LOG_DEBUG;
  commonConfig.preprocessors = {};
  commonConfig.preprocessors['./public/js/*.js'] = ['coverage'];

  config.set(commonConfig);
};
Run Code Online (Sandbox Code Playgroud)

这样做可以让我针对不同的情况运行不同的业力配置。

开发时我使用: karma start config/karma.conf.js

为了在所有浏览器中获得测试覆盖率,我运行: karma start config/test.coverage.js

为了验证我的构建是否干净,作为我的持续集成过程的一部分,我运行 karma start config/build.conf.js

使用这种方法,我可以再次使用 grunt-exec 在适当的时间运行这些命令。