2016-09-24 74 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() 

希望这能解决你的问题

相关问题