我怎样才能 运行 针对 karma.conf.js 中的所有浏览器进行测试,而无需将所有浏览器设为默认浏览器,或者不必在命令行上列出所有浏览器?

How can I run tests against all browsers in karma.conf.js, without making all browsers the default, or having to list them all on the command line?

我有一个 karma.conf.js,它定义了浏览器和许多用于在浏览器堆栈上进行测试的自定义启动器:

browsers: ["Chrome", "Firefox"],
customLaunchers: {
  IE11: {
    base: "BrowserStack",
    browser: "IE",
    browser_version: "11",
    os: "Windows",
    os_version: "10",
  },
  IE10: {
    base: "BrowserStack",
    browser: "IE",
    browser_version: "10",
    os: "Windows",
    os_version: "8",
  },
  // ...
}

大多数时候我只想 运行 针对 Chrome 和 Firefox,但偶尔我想针对配置已知的所有浏览器进行测试 运行 .

我知道我可以将 customLaunchers 的所有键都放在 browsers 中,但这不是一个很好的选择,因为这意味着大多数时候我必须通过 --browsers限制 运行 Chrome 和 Firefox.

我知道我可以在命令行上列出所有浏览器,但这很麻烦,因为列表中有 11 个项目,并且随着时间的推移会变得更长。

那么有没有办法告诉 Karma "run against all the launchers known to you from karma.conf.js"?我已经检查了文档、搜索了问题和 SO,但一无所获。

据我所知没有内置选项。但是,可以修改 karma.conf.js 文件以接受像 all 这样的虚假浏览器名称,它可以用作 karma.conf.js 中的自定义代码应该设置配置以使用所有已知浏览器的信号配置文件:

module.exports = function configure(config) {
  "use strict";
  var options = {
    basePath: "",
    // ...
    browsers: ["Chrome", "Firefox"],
    customLaunchers: {
      IE11: // ...
      IE10: // ...,
      // ...
    }
  };

  // If the user passed `--browsers all`, then we grab the list
  // from the `options` object and modify `config.browsers`.
  var browsers = config.browsers;
  if (browsers.length === 1 && browsers[0] === "all") {
    var newList = options.browsers.concat(Object.keys(options.customLaunchers));

    browsers.splice.apply(browsers, [0, browsers.length].concat(newList));
  }

  config.set(options);
}

options 对象包含您项目的配置。当用户在命令行传递--browsers all时,config.browsers的值被原地修改,列出所有浏览器。请注意,它必须就地修改。用新数组替换值是行不通的,可能是因为 Karma 在 karma.conf.js 是 运行 之前存储了一个引用,并从那时起使用该引用。另外,修改options.browsers的值也没有效果,因为config.browsers优先。 (否则,--browsers [...] 不会覆盖通过 karma.conf.js 传递的配置中的内容。)