javascript - config.set 在 Karma 中做什么?

标签 javascript configuration karma-runner

这两个配置文件有什么不同?

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,
    },
});

最终结果是我将 captureConsoletrue 默认值关闭,而 client 配置选项的其余部分保持不变到它的默认值。如果我天真地这样做:

config.client = {
    captureConsole: false,
};

我会删除默认情况下在 config.client 上设置的其他值(例如 useIframeclearContext 等)当然,我可以这样做:

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/

相关文章:

javascript - Karma单元测试 'undefined'不是函数错误

javascript - 神秘的填充增加

javascript - Jquery 可拖动多项目

xml - 将 activemq 代理配置拆分为多个文件

go - golang 的 Geany 符号列表

c# - 连接字符串问题

gruntjs - 咕噜声 : JASMINE is not supported anymore

dart - 无法将Karma(Dart)配置为运行以运行WebStorm中的guinness.dart测试

javascript - 什么时候使用 __proto__ 什么时候使用原型(prototype)

javascript - 是否可以覆盖 box-sizing :border-box?