这两个配置文件有什么不同?
module.exports = function(config) {
config.set({
basePath: '../..',
frameworks: ['jasmine'],
});
};
和
module.exports = function(config) {
config.basePath = '../..';
config.frameworks = ['jasmine'];
};
第二个更短且更易读,但第一个在整个文档中使用。为什么?
最佳答案
简答
使用 config.set
而不是像在第二个代码片段中那样编写单独的分配是为了方便。它允许我们编写配置,而不必担心 Karma 如何创建初始配置对象的无关紧要的细节。
说明
如果您查看 source ,您将看到 set
方法的实现是:
this.set = function (newConfig) {
_.merge(config, newConfig, function (obj, src) {
// Overwrite arrays to keep consistent with #283
if (_.isArray(src)) {
return src
}
})
}
它使用 Lodash 的 merge
method . (请注意,merge
在 Lodash 4.x 及更高版本中发生了变化。在撰写本文时,Karma restricts Lodash 的安装使用的是 3.x 系列。)
merge
方法使得当您调用 config.set(otherConfig)
时,它会智能地组合 config
和 的值>其他配置
。这是一个方便的问题。如果你愿意,你可以为每个值编写 config.foo.bar = something
,但是你必须担心你设置的值是否已经有默认值。
例如,如果我这样做,我就不必担心 client
是否已经定义以及上面可能存在哪些键:
config.set({
client: {
captureConsole: false,
},
});
最终结果是我将 captureConsole
的 true
默认值关闭,而 client
配置选项的其余部分保持不变到它的默认值。如果我天真地这样做:
config.client = {
captureConsole: false,
};
我会删除默认情况下在 config.client
上设置的其他值(例如 useIframe
、clearContext
等)当然,我可以这样做:
config.client.captureConsole = false;
它会起作用:在 config.client
上定义的其他值将保持不变。但是,Karma 创建的默认配置对象并没有为您可以设置的所有可能选项定义值。例如,如果我这样做了:
config.customPreprocessors.babelModule = { ... };
我会遇到错误,因为 customPreprocessors
没有默认值。我必须改为这样做:
config.customPreprocessors = {
babelModule: { ... },
};
使用 config.set
让我们不用担心这些细节:
config.set({
client: {
captureConsole: false,
},
customPreprocessor: {
babelModule: { ... },
},
});
关于javascript - config.set 在 Karma 中做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40006693/