在您看来,在JavaScript中,依赖注入不可实例化对象的优缺点是什么?
您可能想了解的一些上下文是:
,也可以将不可实例化的“静态”依赖重写为每个测试的假对象。
很重要吗?
代码
不可实例化对象:
WindowFactory = {
buildWindow: function() {
return {};
}
};依赖-注入:
(House = function(windowFactory) {
this.windowFactory = windowFactory;
}).prototype = {
build: function() {
var window = this.windowFactory.buildWindow();
}
};
var house = new House(WindowFactory);与非依赖注入变量:
(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-events、sessionStorage或cookie检索的数据的对象时也很有用。)
现在,当依赖关系本身是一个可实例化的对象时,好处是显而易见的;但是当依赖关系是一个不可实例化的对象(例如,上面代码中的WindowFactory )时,我再次考虑了它的有用性。
发布于 2011-04-28 17:09:15
如果你在单元测试中获得了一些好处,那对我来说可能就足够了。您将能够在不依赖于全局/外部状态的情况下干净地测试该功能。然后,附加的好处变成可读性;在函数的参数中,可以清楚地显示您所依赖的全局状态/api。
能够在测试的设置/删除中更改静态方法是解决问题的方法之一,但我个人认为,这样做容易出错,而且是一项繁重的工作。
https://stackoverflow.com/questions/5288368
复制相似问题