测试是否从控制器单元调用AngularJS调用promise

时间:2015-10-29 14:23:13

标签: angularjs unit-testing karma-jasmine angular-promise

我正在使用karma在AngularJS中编写单元测试,我想测试以下控制器是否正在调用该服务。我不能使用spyOn,因为它是一个承诺,而不是一个功能。我不想测试服务本身,但我无法弄清楚我该怎么做。

    $scope.deleteItem= function(itemId){
    service.deleteItem(itemId)
    .then(function(){
      $scope.info("Deleted");
      $scope.getData();
    }, function(data){
      $scope.critical('error');
    });
};

1 个答案:

答案 0 :(得分:5)

如果没有更多背景信息,我就没有看到为什么spyOn无法运作。这应该。 deleteItem返回承诺的事实并不妨碍您使用spyOn监视deleteItem函数。您应该使用spyOndeleteItem函数替换为间谍,并且您与间谍一起返回的任何值都应该是一个承诺。

在测试中如何将服务注入控制器可能存在问题。您必须发布一些测试代码以确定是否属于这种情况。

如果您在测试中引用了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);
});