2016-05-30 190 views
0

我想,以檢查是否有一個承諾的方法被稱爲測試答應角茉莉花

這裏是我的控制器

app.controller('StoresListController', function ($scope, StoresService) { 

    $scope.getStores = function() { 
     StoresService.getStores().then(function (data) { 
      $scope.stores = data.data; 
     }); 
    }; 
    $scope.getStores(); 

    $scope.deleteStore = function (id) { 
     StoresService.deleteStore(id).then(function() { 
      $scope.getStores(); 
     }); 

    }; 
}) 

和我的測試

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

     serviceMock = { 
      getStores: function(){ 
       // mock promise 
       var deferred = $q.defer(); 
       deferred.resolve({data : 'foo'}); 
       return deferred.promise; 
      }, 
      deleteStore : function(){ 
       var deferred = $q.defer(); 
       deferred.resolve({data : 'foo'}); 
       return deferred.promise; 
      } 
     } 
     spyOn(serviceMock,'getStores').and.callThrough(); 
     controller("StoresListController", {$scope: scope, StoresService: serviceMock});  

    })); 

    it('should call scope.getStores', function(){ 
     scope.$digest(); 
     expect(scope.getStores).toHaveBeenCalled() 
    }); 
    it('should call scope.getStores afeter scope.deleteStore', function(){ 
     scope.deleteStore(1) 
     scope.$digest(); 
     expect(scope.getStores.call.count).toBe(2) 
    }); 

}); 

我有錯誤:期待一個間諜,但得到功能。第一次失敗的第二次,我做錯了什麼?

+0

請注意,您的初始'$從控制器scope.getStores'不返回一個承諾(因爲你不使用'return'聲明),因此它不是真的可用。 – floribon

回答

0

發生此錯誤是因爲您將間諜添加到serviceMock對象而不是StoresService。您也可以撥打該間諜callFake方法來模擬服務

// Notice that you have to inject the StoresService here 
beforeEach(inject(function($rootScope, $controller, $q, StoresService) { 
    rootScope = $rootScope; 
    scope = $rootScope.$new(); 
    controller = $controller; 

    serviceMock = { 
     getStores: function() { 
      // mock promise 
      var deferred = $q.defer(); 
      deferred.resolve({ data: 'foo' }); 
      return deferred.promise; 
     }, 
     deleteStore: function() { 
      var deferred = $q.defer(); 
      deferred.resolve ({ data: 'foo' }); 
      return deferred.promise; 
     } 
    } 
    // Spy for getStores method 
    spyOn(StoresService, 'getStores').and.callFake(serviceMock.getStores); 
    // Spy for deleteStore method 
    spyOn(StoresService, 'deleteStore').and.callFake(serviceMock.deleteStore); 
    // Removed the local injection of StoresService 
    controller("StoresListController", { $scope: scope }); 

})); 

it('should call scope.getStores', function() { 
    scope.$digest(); 
    expect(scope.getStores).toHaveBeenCalled() 
}); 
it('should call scope.getStores afeter scope.deleteStore', function() { 
    scope.deleteStore(1) 
    scope.$digest(); 
    expect(scope.getStores.call.count).toBe(2) 
}); 
+0

仍然錯誤,TypeError:scope.deleteStore不是一個函數並且ReferenceError:StoresService未定義 –