在您看来,在 JavaScript 中依赖注入不可实例化对象的优点和缺点是什么?
您可能想要探索的一些背景是:
不可实例化的对象:
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) 关于有用性的第二个想法。
答案 0 :(得分:1)
如果你在单元测试中获得了一些收益,那对我来说可能就足够了。您将能够在不依赖于全局/外部状态的情况下干净地测试功能。增加的奖金就变成了可读性;你清楚地显示你在函数的参数中依赖的全局状态/ api。
能够在测试的设置/拆卸中更改静态方法是解决问题的一种方法,但我个人觉得这很容易出错并且做家务。