我正在使用karma在AngularJS中编写单元测试,我想测试以下控制器是否正在调用该服务。我不能使用spyOn,因为它是一个承诺,而不是一个功能。我不想测试服务本身,但我无法弄清楚我该怎么做。
$scope.deleteItem= function(itemId){
service.deleteItem(itemId)
.then(function(){
$scope.info("Deleted");
$scope.getData();
}, function(data){
$scope.critical('error');
});
};
答案 0 :(得分:5)
如果没有更多背景信息,我就没有看到为什么spyOn
无法运作。这应该。 deleteItem
返回承诺的事实并不妨碍您使用spyOn
监视deleteItem
函数。您应该使用spyOn
将deleteItem
函数替换为间谍,并且您与间谍一起返回的任何值都应该是一个承诺。
在测试中如何将服务注入控制器可能存在问题。您必须发布一些测试代码以确定是否属于这种情况。
如果您在测试中引用了service
依赖项,则应该可以使用spyOn
来监视deleteItem
方法。然后你只需要提供一个适当的承诺作为返回值。
模拟已解决的承诺:
spyOn(service, 'deleteItem').and.returnValue($q.when(value));
模拟被拒绝的承诺:
spyOn(service, 'deleteItem').and.returnValue($q.reject(value));
在大多数情况下,您需要在测试中的某个地方手动调用$rootScope.$digest()
,让角度生命周期知道是时候解决这个承诺。
在$rootScope.$digest()
之后,您可以验证您的控制器在解决(或拒绝)承诺时采取了适当的措施。
it('controller.deleteItem() should do stuff after service.deleteItem completes successfully', function() {
var controller = createController();
spyOn(service, 'deleteItem').and.returnValue($q.when());
controller.deleteItem('id');
//Tell Angular to resolve the promise
$rootScope.$digest();
// Verify that the controller is in correct state now that promise is resolved
// i.e. expect(something).toEqual(somethingElse);
});