2016-09-24 45 views
0

我有一個控制器功能,看起來像:

$scope.clearMarkers = function(){ 
    for(var i = 0; i < $scope.markers.length; i++){ 
     $scope.markers[i].setMap(null); 
    } 
    $scope.markers = []; 
}; 

我對上面看起來像單元測試:

describe('clearMarkers Test', function(){ 
    it('should call the setMap() method on each array object inside of scope.markers and then set scope.markers to an' + 
     'empty array', function(){ 
     scope.markers = [{ 
      setMap: jasmine.createSpy('scope.markers[0]#setMap') 
     }, { 
      setMap: jasmine.createSpy('scope.markers[1]#setMap') 
     }, { 
      setMap: jasmine.createSpy('scope.markers[2]#setMap') 
     }]; 
     scope.clearMarkers(); 
     expect(scope.markers[0].setMap).toHaveBeenCalledWith(null); 
     expect(scope.markers[1].setMap).toHaveBeenCalledWith(null); 
     expect(scope.markers[2].setMap).toHaveBeenCalledWith(null); 
     expect(scope.markers).toEqual([]); 
    }); 
}); 

聲稱的setMap()方法應該被稱爲時,以上測試就會因錯誤因爲在$scope.clearMarkers()中設置$scope.markers = []也會刪除我創建的間諜。

如果我在$scope.clearMarkers()中註釋掉$scope.markers = [],那麼我的setMap()聲明按預期工作。

在這種情況下我會如何保留我的間諜?

回答

0

間諜應該是在呼叫的時刻對象的方法,但他們並不需要爲對象的方法可以斷言:

var markerSpy1 = jasmine.createSpy(); 
... 

scope.markers = [ 
    { setMap: markerSpy1 }, 
    ... 
]; 

scope.clearMarkers(); 
expect(markerSpy1).toHaveBeenCalledWith(null); 
... 
expect(scope.markers).toEqual([]); 
+0

當你downvoting一個正確的答案,請解釋一下你的決定。 – estus

+0

@LloydBanks這個問題被忽視,沒有任何反饋。解決方案對你有幫助嗎?如果他們這樣做,考慮接受一個答案。 – estus

0

你可以這樣做,創造實際的功能spys和檢查,如果他們被叫或不被叫,

describe('clearMarkers Test', function(){ 
it('should call the setMap() method on each array object inside of scope.markers and then set scope.markers to an' + 
    'empty array', function(){ 

    spyOn(scope.markers[0], 'setMap')// setting spy on this function 
    spyOn(scope.markers[1], 'setMap') 
    spyOn(scope.markers[2], 'setMap') 
    scope.markers = [{ 
     setMap: jasmine.createSpy('scope.markers[0]#setMap') 
    }, { 
     setMap: jasmine.createSpy('scope.markers[1]#setMap') 
    }, { 
     setMap: jasmine.createSpy('scope.markers[2]#setMap') 
    }]; 
    scope.clearMarkers(); 
    expect(scope.markers[0].setMap).toHaveBeenCalledWith(null); 
    expect(scope.markers[1].setMap).toHaveBeenCalledWith(null); 
    expect(scope.markers[2].setMap).toHaveBeenCalledWith(null); 
    expect(scope.markers).toEqual([]); 
}); 

});

,如果你要調用的暗中監視功能,以及只使用:

spyOn(scope.markers[0], 'setMap').and.callThrough() 

希望這能解決你的問題

相關問題