当我使用 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);
},
我正在尝试传递 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);
},