测试是否从控制器单元测试调用 promise AngularJS
Testing if a promise is called from a controller unit-testing AngularJS
我正在使用 karma 在 AngularJS 中编写单元测试,我想测试以下控制器是否正在调用该服务。我不能使用 spyOn,因为它是一个承诺而不是一个函数。我不想测试服务本身,但我不知道该怎么做。
$scope.deleteItem= function(itemId){
service.deleteItem(itemId)
.then(function(){
$scope.info("Deleted");
$scope.getData();
}, function(data){
$scope.critical('error');
});
};
没有更多上下文,我不明白为什么 spyOn
不起作用。这应该。 deleteItem
return 是一个承诺这一事实并不能阻止您使用 spyOn
来监视 deleteItem
函数。您应该使用 spyOn
将 deleteItem
函数替换为间谍,并且您对间谍 return 的任何值都应该是一个承诺。
您在测试中将服务注入控制器的方式可能存在问题。您必须 post 一些测试代码来确定是否属于这种情况。
如果您在测试中引用了 service
依赖项,您应该能够使用 spyOn
来监视 deleteItem
方法。然后你只需要提供一个适当的承诺作为 return 值。
模拟已解决的承诺:
spyOn(service, 'deleteItem').and.returnValue($q.when(value));
模拟被拒绝的承诺:
spyOn(service, 'deleteItem').and.returnValue($q.reject(value));
并且在大多数情况下,您需要在测试中的某个地方手动调用 $rootScope.$digest()
,让 angular 生命周期知道是时候解决承诺了。
在 $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);
});
我正在使用 karma 在 AngularJS 中编写单元测试,我想测试以下控制器是否正在调用该服务。我不能使用 spyOn,因为它是一个承诺而不是一个函数。我不想测试服务本身,但我不知道该怎么做。
$scope.deleteItem= function(itemId){
service.deleteItem(itemId)
.then(function(){
$scope.info("Deleted");
$scope.getData();
}, function(data){
$scope.critical('error');
});
};
没有更多上下文,我不明白为什么 spyOn
不起作用。这应该。 deleteItem
return 是一个承诺这一事实并不能阻止您使用 spyOn
来监视 deleteItem
函数。您应该使用 spyOn
将 deleteItem
函数替换为间谍,并且您对间谍 return 的任何值都应该是一个承诺。
您在测试中将服务注入控制器的方式可能存在问题。您必须 post 一些测试代码来确定是否属于这种情况。
如果您在测试中引用了 service
依赖项,您应该能够使用 spyOn
来监视 deleteItem
方法。然后你只需要提供一个适当的承诺作为 return 值。
模拟已解决的承诺:
spyOn(service, 'deleteItem').and.returnValue($q.when(value));
模拟被拒绝的承诺:
spyOn(service, 'deleteItem').and.returnValue($q.reject(value));
并且在大多数情况下,您需要在测试中的某个地方手动调用 $rootScope.$digest()
,让 angular 生命周期知道是时候解决承诺了。
在 $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);
});