测试是否从控制器单元测试调用 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 函数。您应该使用 spyOndeleteItem 函数替换为间谍,并且您对间谍 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);
});