Karma:如何在命令行上更改预处理器(或在配置中切换预处理器)

时间:2014-08-15 22:51:14

标签: javascript command-line karma-runner

我想用不同的预处理器运行Karma几次。根据失败情况,业力执行官会在命令行上听取--preprocessors,但我无法正确设置。

以下都返回相同的错误。

karma start --single-run web-app/karma.conf.js --preprocessors "{\"../grails-app/assets/javascripts/**/!(lib)/**/*.js\": \"jshints\"}"
karma start --single-run web-app/karma.conf.js --preprocessors {"../grails-app/assets/javascripts/**/!(lib)/**/*.js": "jshints"}
karma start --single-run web-app/karma.conf.js --preprocessors "{'../grails-app/assets/javascripts/**/!(lib)/**/*.js': 'jshints'}"

错误:

/usr/lib/node_modules/karma/lib/config.js:145
  Object.keys(preprocessors).forEach(function(pattern) {
         ^
TypeError: Object.keys called on non-object
    at Function.keys (native)
    at normalizeConfig (/usr/lib/node_modules/karma/lib/config.js:145:10)
    at Object.parseConfig (/usr/lib/node_modules/karma/lib/config.js:293:10)
    at Object.exports.start (/usr/lib/node_modules/karma/lib/server.js:282:20)

为什么我这样做,还有其他选择吗?

coveragejshint预处理器不兼容。我可以复制karma.conf.js,但这对于可维护性来说不是一个很好的长期选择。

1 个答案:

答案 0 :(得分:2)

创建karma.conf.js模板。

module.exports = {
  ...
}

为业力创建一个包装器(让我们称之为' wrapper.js'):

var karma = require('karma');

function configurator(options){
  var config = getTemplate();

  // based on the options object will add different preprocessors
  if(options.blah){
    config.preprocessors["../grails-app/assets/javascripts/**/!(lib)/**/*.js"] = 'whatever';
  }
  return config;
}

function getTemplate(){
    return {
      // start with an empty object
      preprocessors: {},
      // point to the template, we will enrich it
      configFile : __dirname + 'path/to/your/karma.conf.js'
    };
}

function startKarma(options){
  var config = configurator(options);
  karma.server.start(config, function(exitCode){
    // exit code === 0 is OK
    if (!exitCode) {
        console.log('\tTests ran successfully.\n');
        // rerun with a different preprocessor
        startKarma({blah1: true});
    } else {
        // just exit with the error code
        process.exit(exitCode);
    }
  });
}

function passedArg(string){
  // look at the arguments passed in the CLI
  return process.argv.indexOf(string) > -1;
}

function start(){
  // start with empty options
  var options = {};

  if(passedArg('blah')){
    options.blah = true;
  }
  //start karma!
  startKarma(options); 
}

start();

此时您可以从控制台传递参数:

$ node wrapper.js blah

有关业力API的更多信息,请查看:http://karma-runner.github.io/0.8/dev/public-api.html