优点&依赖注入不可实例化对象的缺点

时间:2011-03-13 08:50:55

标签: javascript unit-testing dependency-injection refactoring

在您看来,在 JavaScript 中依赖注入不可实例化对象的优点和缺点是什么?

您可能想要探索的一些背景是:

  • 单元测试
    • 值得注射吗?毕竟,即使没有dep-injection,也可以为每个测试覆盖不可实例化的“静态”依赖关系到虚假对象。
  • 重构
    • 定位和定位会变得更加困难吗?重构不可实例化的依赖?
  • 可读性
    • 哪种实施更容易理解?隐含性或明确性对你很重要吗?
  • 文件大小


代码

不可实例化的对象:

WindowFactory = {
  buildWindow: function() {
     return {};
  }
};

依赖注入:

(House = function(windowFactory) {
  this.windowFactory = windowFactory;
}).prototype = {
  build: function() {
    var window = this.windowFactory.buildWindow();
  }
};

var house = new House(WindowFactory);

VS。非依赖性注入变体:

(House = function() {
}).prototype = {
  build: function() {
    var window = WindowFactory.buildWindow();
  }
};

var house = new House();


上下文

我的主要目标是使上面的代码可测试。我已经进入了 外在化可实例化依赖关系的习惯(例如var window = new Window(); var house = new House(window);)。单位 - 这有助于 测试可实例化的对象(例如House),因为它不是真实的 依赖项(Window)我可以用假(var fakeWindow = {}; var house = new House(fakeWindow);)实例化对象,而不必 担心在测试我的时候冗余地测试依赖项 宾语。 (这种形式的依赖注入在测试时也很有用 依赖于通过XHR,DOM事件检索的某些数据的对象, sessionStorage或cookie。)

现在,当依赖项是一个可实例化的对象本身时, 好处对我来说很清楚;但当依赖是非 我有可实例化的对象(例如上面代码中的WindowFactory) 关于有用性的第二个想法。

1 个答案:

答案 0 :(得分:1)

如果你在单元测试中获得了一些收益,那对我来说可能就足够了。您将能够在不依赖于全局/外部状态的情况下干净地测试功能。增加的奖金就变成了可读性;你清楚地显示你在函数的参数中依赖的全局状态/ api。

能够在测试的设置/拆卸中更改静态方法是解决问题的一种方法,但我个人觉得这很容易出错并且做家务。