2016-05-25 9 views
0

Ich versuche, einen Unit-Test unter Verwendung von Karma und Jasmin für einen Angular Controller zu schreiben, dieEckige Unit-Test-Controller mit Service

storesController.js

(function() { 
var app = angular.module('storesController', ['storesService']); 

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(); 
     }); 

    }; 
}); 

storesService.js auf einen Dienst abhängt

(function() { 
var app = angular.module('storesService', []); 

app.factory('StoresService', ['$http', function ($http) { 

     var stores = []; 

     stores.getStores = function() { 
      return $http.get(/api/getStores'); 
     };    
     stores.deleteStore = function (storeID) { 
      return $http.delete(/api/deleteStore/'+storeID); 
     }; 
     return stores; 

    }]); 
})(); 

Und den Test, controllers.spec.js

describe('StoresController', function() { 
    beforeEach(module('storesController')); 

    var scope; 
    var storesServiceMock; 
    var controller; 

    beforeEach(inject(function ($controller, $rootScope) { 

     storesServiceMock = { 
      getStores: function() { 
      }, 
      deleteStores: function() { 
      } 
     }; 
     spyOn(storesServiceMock, 'getStores').and.returnValue({name : 'TestName', country : 'TestCountry'}) 

     scope = $rootScope.$new(); 
     controller = $controller('StoresListController', { 
      $scope: scope, StoresService: storesServiceMock 
     }); 
    })); 

    it('scope.stores should be defined', function() { 
      expect(scope.stores).toBeDefined; 
    }); 
}); 

Und ich bin immer

TypeError: StoresService.getStores(...).then is not a function at n.$scope.getStores 

ich auch Breite habe versucht httpBackend aber ich bin nicht in der Lage sein, damit es funktioniert, keine Ahnung, was ich falsch mache?

Antwort

1

Lassen Sie den Spion ein Versprechen abgeben.

Mit ES2015:

spyOn(storesServiceMock, 'getStores').and.returnValue(Promise.resolve({name : 'TestName', country : 'TestCountry'})); 

mit $ q:

spyOn(storesServiceMock, 'getStores').and.callFake(function() { 
    var deferred = $q.defer(); 
    deferred.resolve({name : 'TestName', country : 'TestCountry'})); 
    return deferred.promise; 
}); 
+0

es funktioniert auf Chrome und Firefox, sondern wirft und Fehler auf, dh Reference: 'Versprechen' nicht bei Anonym-Funktion definiert –

+0

Leider , benötigen Sie einen neueren Browser oder verwenden Sie etwas wie Babel, um zu transpilieren (oder erstellen Sie ein Versprechen mit angulars $ q-Bibliothek). – Lee

+0

Nun, bei meinem Test läuft noch etwas schief. Er läuft mit 'expect (scope.stores) .toBeDefined(); 'und' expect (scope.stores) .toBeUnDefined(); ', das sollte nicht passieren und immer noch nicht funktionieren' expect (scope.stores.lenth) .toBeLessThan (2) ', got kann die 'length' Eigenschaft von null oder undefined nicht bekommen –