2016-05-30 159 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未定义 –