2017-02-28 50 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來實現你的測試用例。