【问题标题】:Testing if a promise is called from a controller unit-testing AngularJS测试是否从控制器单元测试AngularJS调用promise
【发布时间】:2016-01-29 17:58:37
【问题描述】:

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

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

【问题讨论】:

  • 如果您也提供单元测试的源代码会很有帮助,这样我们就可以准确地看到您是如何尝试设置间谍的。

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


【解决方案1】:

没有更多上下文,我不明白为什么spyOn 不起作用。这应该。 deleteItem 返回一个承诺这一事实并不能阻止您使用spyOn 来监视deleteItem 函数。您应该使用spyOndeleteItem 函数替换为间谍,并且您使用间谍返回的任何值都应该是一个承诺。

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

如果您在测试中引用了service 依赖项,您应该能够使用spyOn 来监视deleteItem 方法。然后你只需要提供一个合适的promise作为返回值。

模拟一个已解决的承诺:

spyOn(service, 'deleteItem').and.returnValue($q.when(value));

模拟一个被拒绝的承诺:

spyOn(service, 'deleteItem').and.returnValue($q.reject(value));

并且在大多数情况下,您需要在测试中的某个位置手动调用 $rootScope.$digest() 以让 Angular 生命周期知道是时候解决承诺了。

$rootScope.$digest() 之后,您可以验证您的控制器在promise 被解决(或拒绝)时采取了正确的操作。

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);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多