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

标签 javascript dependency-injection

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

相关文章:

javascript - 使用 jQuery 的选项卡不透明度

javascript - 尝试使用 vanilla javascript 使我的导航栏移动友好

java - Spring:重写/模拟依赖的依赖

dependency-injection - 有没有人对依赖注入(inject)有一个很好的类比?

c# - 简易喷油器 : Injecting a property in a base class

javascript - 在与 webpack 进行 react 时导入react-leaflet会返回错误

javascript - 删除子域设置的子域cookie

javascript - 弹出窗口插件

c# - Microsoft.Extensions.DependencyInjection 自动解析对象依赖关系

php - zf2 解析模块 View 路径