当我使用 RequireJS 时,提供给 "karma run" 的客户端参数 (clientArgs) 无效

The client arguments (clientArgs) given to "karma run" have no effect when I'm using RequireJS

我正在尝试传递 grep 参数,以便 karma-mocha 插件将它传递给 Mocha 并且 运行 只传递匹配 grep 的测试。命令行是这样的:

./node_modules/.bin/karma run -- --grep='one'

然而,Karma 实际上会遍历所有测试,就像我不使用 --grep 一样。根据 karma run --help-- 之后的所有内容都应该是客户端参数。 (在帮助和关于如何 运行 karma run 的讨论中,它被称为 clientArg。)我尝试了一个没有 RequireJS 的小项目,它成功了。似乎添加 RequireJS 导致了问题。这是一个重现问题的小设置:

karma.conf.js:

module.exports = function(config) {
  config.set({
    basePath: '',
    frameworks: ['mocha', 'requirejs'],
    files: [
      'test-main.js',
      { pattern: 'test/**/*.js', included: false }
    ],
    exclude: [],
    preprocessors: {},
    reporters: ['progress'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: false,
    browsers: ['Chrome'],
    singleRun: false,
    concurrency: Infinity
  });
};

test-main.js:

var allTestFiles = [];
var TEST_REGEXP = /(spec|test)\.js$/i;

Object.keys(window.__karma__.files).forEach(function (file) {
  if (TEST_REGEXP.test(file)) {
    var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, '');
    allTestFiles.push(normalizedTestModule);
  }
});

require.config({
  baseUrl: '/base',
  deps: allTestFiles,
  callback: window.__karma__.start
});

您在这里看到的在功能上等同于最初由 karma init 生成的股票 test-main.js。仅对其进行编辑以删除注释、规范化 space 和添加分号。

test/test.js 文件包含:

it("one", function () {});
it("two", function () {});

说明

这是 karma init 如何生成用于配置 RequireJS 和启动测试的 test-main.js 文件的问题。这个问题 不是 特定于 Mocha,但很可能会发生在接受通过 clientArgs.

传递的参数的其他跑步者身上

karma init生成的test-main.js居然坏了。 You can see here 当 Karma 自己调用 start 时,它用自己的配置调用它:

this.loaded = function () {
  // has error -> cancel
  if (!hasError) {
    this.start(this.config)
  }
[...]

但是,由 karma init 创建的 test-main.js 调用 start 时没有任何参数,这就是为什么您的插件没有获得它应该获得的参数的原因。

解决方案

修改您的 test-main.js 以在您的 RequireJS 配置中包含此 callback

callback: window.__karma__.start.bind(window.__karma__, window.__karma__.config)

这将导致 start 的调用方式与前面显示的代码片段中的调用方式相同。如果出于某种原因你不喜欢 bind 或者需要在你的回调中做更多的事情,你可以这样做:

callback: function () {
  // Other stuff...
  window.__karma__.start.call(window.__karma__, window.__karma__.config);
},