2017-02-28 49 views
0

我有一个函数:茉莉花测试情况下,当一个函数被调用的if语句

function getNames() { 
     var ids = []; 
     var checkAttr = function (array, attr, value) { 
      for (var i = 0; i < array.length; i++) { 
       if (array[i][attr] === value) { 
        return false; 
       } 
      } 
      return true; 
     }; 
     for (var i = 0; i < result.length; i++) { 
      var selected = result[i]; 
      if (checkAttr($scope.names, "name", selected.name) && ids.indexOf(selected.id) === -1 && selected.myInfo && selected.name !== "") { 
       $scope.fundNames.push({ 
        name: selected.name, 
        id: selected.id 
       }); 
       ids.push(selected.id); 
      } 
     } 
     ... 
    } 

我想写一个测试,检查,我现在用的是checkAttr函数来检查这两个名称和ID删除重复。但我不知道如何。我尝试使用spyOn,但不断收到错误。

我想要的东西,内容是这样的:

it('should check the name and id to remove duplicates', function() { 
    //do something here 
}); 
+1

您只能在您有权访问的对象上公开作为方法的'spyOn'函数。例如,如果'myObj.myFunc'是一个函数,我可以窥探它作为'spyOn(myObj,'myFunc')'。由于checkAttr在'getNames'中是私有的,因此您无法直接访问它。像@anied说的 –

+1

,你不能窥探那些私密的方法。你能够给我们多一点代码来合作吗? 'getNames'究竟使用了多少?它可以变成'$ scope.getNames' –

回答

3

这是不可能的嘲笑该方法无需改变你的代码。

我想如果你可以窥探一个私人函数,这将是一个糟糕的测试。通常你的测试不能知道你的函数的内部实现,因为如果你改变内部函数,你必须改变你的测试。这是一个不好的做法。在你的情况下,你应该通过设置$scope.names并在$scope.fundNames调用后检查结果来测试函数getNames,就像黑盒子一样。

但是你可以将checkAttr函数移到外面,并通过spyOn来实现你的测试用例。