2014-10-10 82 views
0

我想单元测试依赖于异步API调用(承诺)的Angular控制器中的函数。如何在Jasmine中测试服务相关函数?

我在一个调用服务,并且基于所述服务的结果在控制器中的$范围变量的控制装置的功能:

$scope.display = 'loading'; 

$scope.loadData = function() {       
     ApiService.getSummary().then(     
      function (response) {        
       $scope.displayData(response.data); 
       $scope.display = 'boxes';      
      },             
      function (error) {         
       $scope.display = 'error';      
      }             
     );              
    }; 

我有以下茉莉单元测试

var FunctionFixtures = { 
     successFunc: function() { 
      var deferred = $q.defer(); 
      var response = { 
       'data': dataVar 
      }; 
      deferred.resolve(response); 
      return deferred.promise; 
     }, 
     errorFunc: function() { 
      var deferred = $q.defer(); 
      deferred.reject(); 
      return deferred.promise; 
     } 
    }; 

it('should show the boxes on data load success', function(){ 
     spyOn(ApiService, 'getSummary').and.callFake(FunctionFixtures.successFunc); 
     $scope.loadData(); 
     expect($scope.display).toBe('boxes'); 
    }); 

当我运行测试,我得到以下错误:

Error: Expected 'loading' to be 'boxes'. 

我埃森一定要伪造api调用并返回成功或失败,并确保$ scope.display被设置为适当的字符串,即'boxes'用于成功和'错误'失败。有关如何做到这一点的任何想法?

+0

你在测试中是否缺少'$ scope.loadData()'!? – friedi 2014-10-10 18:33:08

+0

不,对不起@friedi,我只是在测试中将$ scope.loadData()称为一行。我简化了代码,使其更通用。 – 2014-10-10 18:59:50

回答

0

看起来您在呼叫loadData()之后但在致电expect之前错过了致电$rootScope.apply()的呼叫。

由于角度承诺与$rootScope的集成方式如何,您需要运行摘要循环以解决承诺,以调用其回调函数,如https://code.angularjs.org/1.2.26/docs/api/ng/service/ $ q#测试所示。