2014-06-19 131 views
0

我控制器做類似下面(請注意,我沒有表現出爲簡單起見,所有依賴):測試輸出

.controller('demo',function(){ 

     fn1(){ 
      var defereed = $q.defer; 
      /* fetch data from server and once the data is fetched perform a resolve */ 
      return deferred.promise; 
     } 

    fn2(){ 
     var defereed = $q.defer; 
      /* fetch data from server and once the data is fetched perform a resolve*/  
      return deferred.promise; 
    } 

    fun3() { /*makes some server side calls and updates the view*/} 

    $q.all([fn1(),fn2()] .then(function(result){ 
      if (result[0]) { fn3();} 
     }); 

    } 

在這種情況下,我已經有一個困難時期測試是否調用fn3()。我也無法獲得fn1()和fn2()來解決,因此我可以測試fn3()

任何提示將不勝感激。

+0

您應該使用$ httpBackend嘲笑服務器 –

+0

不要」想$ httpBackend適用在這裏.. – runtimeZero

回答

0

最後figuered的解決方案。對於那些有興趣檢查該plnkr: http://plnkr.co/HkaQdH

describe('Testing: MainCtrl', function() { 
    var $scope = null; 
    var ctrl = null; 
    var mockInitService; 
    var defer1,defer2; 
    var $q; 

    beforeEach(module('plunker')); 

    beforeEach(inject(function($rootScope, $controller,$q) { 
    $scope = $rootScope.$new(); 
    $q = $q; 

    mockInitService = { 
     fn1: function(){}, 
     fn2: function(){}, 
     fn3: function(){} 
    }; 
    defer1 = $q.defer(); 
    defer2 = $q.defer(); 

    spyOn(mockInitService,'fn1').and.returnValue(defer1.promise); 
    spyOn(mockInitService,'fn2').and.returnValue(defer2.promise); 
    spyOn(mockInitService,'fn3'); 

    createController = function() { 
     return $controller('MainCtrl', { 
     $scope: $scope, 
     InitService: mockInitService 
     }); 
    } 

    })); 

    it('Should call InitService.fn3', function() { 
    ctrl = createController(); 
    defer1.resolve(); 
    defer2.resolve(); 
    $scope.$digest(); 
    expect(mockInitService.fn3).toHaveBeenCalled(); 
    }); 

});