【问题标题】:karma start - passing parameters业力开始 - 传递参数
【发布时间】:2016-12-17 00:06:57
【问题描述】:

有没有办法通过 Karma 命令行传递参数,然后在测试中的某个地方读取该参数?例如,这就是想要的:

karma start -branding="clientX"

然后在我的规范中的某个地方我需要访问这个变量(我需要“clientX”值)。

这可能吗?

【问题讨论】:

  • @JeremyKahan 仍然无法正常工作:(
  • karma start --BRANDING clientX 在命令行上(注意--,没有=,没有引号)。而在 karma.conf.js module.exports = function (config) { config.set({ brand: config.BRANDING,

标签: angularjs unit-testing karma-runner karma-jasmine


【解决方案1】:

可以将参数传输到测试用例。这可能有点棘手。你可以做的是在你的测试套件中检查__karma__.config.args

it("get karma args", function () {
    console.log(__karma__.config.args);
});

karma run

如果你想用karma run 传递参数,那么以上就是你所需要的。

然后,如果您执行karma start,然后执行karma run -- --foo,您应该会在控制台上看到:

LOG: ['--foo']

注意传递给karma run 的参数是如何以__karma__.config.args 结尾的。另请注意,karma run -- --foo 中的第一个双破折号用于将 Karma 参数与“客户端参数”分开,这是必要的。 (karma start 没有同样的区别。)

karma start

karma start 的工作方式不同。

如果您使用由karma init 创建的默认karma.conf.js,您将无法通过karma start --single-run --foo 以这种方式传递参数。您需要修改 karma.conf.js 以传递参数:

module.exports = function(config) {
  config.set({
    client: {
        args: config.foo ? ["--foo"] : [],
    },

如果您运行karma start --single-run --foo,那么您将获得与之前run 相同的输入。

如果我必须传递多个参数,我会扫描 process.argv 以过滤掉其中仅用于 Karma 的部分,并将其余部分传递给 args,而不是测试每种可能性。

您可能从上面推断出,当您 karma start --single-run --something 时,参数在 karma.conf.js 中以 config.something 结尾。

完整示例

本示例针对 Karama 1.1.x 和 Karma 1.2.0 进行了测试。它显示了我上面讨论过的相同方法来获取命令行参数以通过client.args 传输。这适用于karma startkarma run。我还添加了一种无需通过client.args 即可传递值的方法(即branding 示例)。但是,此方法不适用于karma run

karma.conf.js:

module.exports = function(config) {
  config.set({
    basePath: '',
    client: {
        // Example passing through `args`.
        args: config.foo ? ["--foo"] : [],

        // It is also possible to just pass stuff like this,
        // but this works only with `karma start`, not `karma run`.
        branding: config.branding,
    },
    frameworks: ['jasmine'],
    files: [
      'test/**/*.js'
    ],
    exclude: [],
    preprocessors: {},
    reporters: ['progress'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: false
  });
};

test/test.js:

it("get karma arg", function () {
    console.log("BRANDING", __karma__.config.branding);
    console.log("ARGS", __karma__.config.args);
});

如果你运行karma start --single-run --foo --branding=q,你会得到:

LOG: 'BRANDING', 'q'
LOG: 'ARGS', ['--foo']

如果你启动 Karma 然后使用karma run -- --foo --branding=q,你会得到:

LOG: 'BRANDING', undefined
LOG: 'ARGS', ['--foo', '--branding=q']

如上所述,使用karma run时,所有内容都必须经过config.args才能在测试中可见。

【讨论】:

  • 嘿,我想传递多个参数,我该如何传递呢?在 --grep=foo1, foo2 的 client.args 中,我应该如何通过?像这样,但它不起作用(,args:['--grep= foo1,foo2'])
【解决方案2】:

是的,这是可能的。您所要做的就是在karma.conf.jsclient 部分中指定该参数:​​

module.exports = function (config) {
    config.set({
        basePath: '',
        frameworks: ['jasmine'],
        plugins: [
            ...
        ],
        client: { //Put the parameters here
            codeCoverage: config.cc,
            testSuite: config.testSuite
        },
...

通过它:

karma start --cc --testSuite=sanity

请注意,如果您不给参数赋值(如--cc),它将被设置为true

从测试中访问它:

console.log('Coverage: ', __karma__.config.codeCoverage);
console.log('Test suite: ', __karma__.config.testSuite);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2014-07-13
    • 2012-07-03
    • 1970-01-01
    相关资源
    最近更新 更多