大JS应用程序测试 - 避免多个karma.conf.js文件

时间:2013-11-17 18:06:25

标签: javascript testing gruntjs karma-runner

我使用业力 + jasmine + 幻像进行无头Javascript测试。

我遇到的问题是我有一个非常大的应用程序,包含许多我想测试的JS模块。 所以我需要针对每个案例进行自定义模拟,并为每个案例定制自定义模式。

karma.conf.js只允许我拥有files数组,其中包含所有要包含的文件的模式,如果我的应用程序很小而且不是一个包含大量文件和模块的大应用程序,那么该数组很棒。

我的解决方案目前 - 为每个测试用例创建多个karma.conf.js文件。但这真的很糟糕,因为有这么多配置文件是一个很大的问题,如果我想更改一个设置(如 autoWatch ),我需要更改所有的配置文件。

我的其他解决方案 - 在karma.conf.js前面编写自定义处理程序来处理其他参数(规范文件或文件夹以绕过业力搜索其配置文件)并简单地构建{{1} }动态数组。

现在我看到的问题是业力只运行一次,我只能运行一个测试规范......而且我不想修改KARMA本身

我还考虑过使用 Grunt ,但还没有办法让它适用于多个测试用例。

顺便说一下,我的理想结构是这样的:

有文件:

files

配置文件:

test/specs/category/unit1_spec.js
test/mocks/category/unit1_mock.js

模拟文件将从适当的mocks目录中自动获取。

我可以files: [ { 'includes': [array_of_includes], 'spec': 'spec_file' } ] ,它会以递归方式运行文件夹中的所有测试用例。

tl; dr - 我想测试一个很棒的应用程序。

我希望任何建议来处理此任务。

4 个答案:

答案 0 :(得分:16)

使用ENV变量将参数传递给karma.conf.js中的文件:

files: [
  include1, include2, ..., includeN,
  process.env.JS_TESTS + "/*.js"
]

然后像这样运行业力:

JS_TESTS=test/category2 karma start karma.conf.js

答案 1 :(得分:16)

您可以在karma配置文件中使用require语句。

例如,在您的业力配置文件中,您可以这样做:

files: require('./karma.conf.files')

要获得更全面的答案..我在此链接中找到了另一种解决方案:https://groups.google.com/forum/#!topic/karma-users/uAf7TuVBmCQ

有业力0.8(当前稳定)

// shared_conf.js
module.exports = {
  port: 8080
};

// karma1.conf.js
var shared = require('./shared_conf.js');

port = shared.port;

有业力0.9(目前处于金丝雀释放状态):

// shared_conf.js
module.exports = function(karma) {
  karma.configure({
    port: 8080  
  });
};

// karma1.conf.js
var shared = require('./shared_conf.js');
module.exports = function(karma) {
  shared(karma);
  karma.configure({
    // override
  });
};

这对我来说可以从单独的配置文件中提取一组文件名。

答案 2 :(得分:8)

grunt-karma听起来非常适合您的需求。

这是一个繁琐的多任务,它允许子任务具有通用配置,可以被特定的子任务覆盖。

该插件将Karma配置整合到一个文件中。 例如:

karma: {
  options: {
    configFile: 'karma.conf.js',
    runnerPort: 9999,
    browsers: ['Chrome', 'Firefox']
  },
  category1: {
    files: ['app/js/category1/**/*.js', 'test/category1/*.js']
  },
  category2: {
    files: ['app/js/category2/**/*.js', 'test/category2/*.js']
  }
}

答案 3 :(得分:2)

我注意到无论你传递给命令行的什么参数,你都会在初始配置对象中获得这个参数camelCased。

> karma start i-wanna-debug

module.exports = function (config) {
    config.set({
        singleRun: config.iWannaDebug ? false : true
    });
};

这允许您使用具有多个配置的单个Karma配置文件。