我在js中有一段这样的代码:
var obj = (function(){
var stateObj = {key:"privateValue"};
return {
getState: function() {
return stateObj.key;
},
publicFn : function(){
//do some operation with stateObj
if(getState() == "test") {
//. . . .
}
}
}
}());
我测试了这样的代码:
//test case
sandbox.stub(obj.getState,"test")
assertItShouldGoInsideIfLoop(obj.publicFn())
但是在代码审查时,我的团队负责人说,这是错误的,他要求我在这些情况下使用依赖注入(inject)。
我真的不知道为什么上述方法是错误的,甚至不知道为什么应该使用 DI。
最佳答案
如果我的解释正确,这里的问题是您对调用 publicFn
的值的测试取决于 stateObj
的值。依赖注入(inject)背后的整个想法是,您提供一些方法在测试中提供这些值,以便将数据与被测试函数的行为分离。
var obj = (function(){
return {
setStateObj: function(stateObj) {
this.stateObj = stateObj;
},
getState: function() {
return this.stateObj.key;
},
publicFn : function(){
//do some operation with stateObj
if(getState() == "test") {
//. . . .
}
}
}
}());
现在我们可以使用 setStateObj
在测试中根据需要设置状态,而不是对值进行 stub ,这可能很危险:
obj.setStateObj({ key: 'test' })
assertItExecutesIfStatement(obj.publicFn())
obj.setStateObj({ key: 'blah' })
assertItDoesntExecuteIfStatement(obj.publicFn())
那么为什么这比 stub getState
更受欢迎呢?假设我们注释 getState
的内容:
getState: function() {
// return this.stateObj.key;
}, // returns nothing, but you're stubbing it to return "test" anyway!
显然,这个函数不起作用,但是有了你的 stub ,它就可以了!因此,尽管代码不起作用,您仍将通过测试!
这是另一个例子,它为依赖注入(inject)提供了另一种情况。假设我有以下功能:
function getDayOfWeek() {
var date = new Date();
var dayNames = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
return dayNames[date.getDay()];
}
这个getDayOfWeek
函数依赖于date
。这对于测试来说将是一场噩梦,因为我们无法控制 date
的值。如果我们用提供日期值的方式重写此函数(即注入(inject)依赖项),我们可以轻松检查测试任何固定日期的函数:
function getDayOfWeek(date) {
date = date || new Date();
var dayNames = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
return dayNames[date.getDay()];
}
assertEqual('Wednesday', getDayOfWeek(new Date(2015, 0, 1)));
assertEqual('Thursday', getDayOfWeek(new Date(2015, 0, 2)));
// and so on...
关于javascript - 如何使用依赖注入(inject)进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30388291/