2014-10-10 88 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#測試所示。