gpt4 book ai didi

javascript - 如何使用依赖注入(inject)进行测试?

转载 作者:行者123 更新时间:2023-11-29 21:48:06 34 4
gpt4 key购买 nike

我在 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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com