2013-05-29 12 views
6

Ich versuche, einen Controller in meinem Angular Rahmen zu testen:Verwendung während eines Winkel Controller testen

.controller('UserCtrl', ['$scope', '$location', 'User', 'Config', 
    function ($scope, $location, User, Config) { 
     ... 
    }]) 

Dieser Controller auf ein paar Dienstleistungen abhängt, die die $ HTTP-Objekt benötigen zu machen Server ruft:

.factory('User', ['$http', function ($http) { 
    var data = {}; 

    return { 
     query: function(oper, putdata, callback){ 
      if(oper == 'get'){ 
      $http.get(getUrl("user",null)).success(function(data2) { 
       console.log(data2); 

       callback(data2); 
       data.userinfo = data2; 
      }); 
      }, 

     userinfo: data 
    }; 
}]) 

Aber wenn ich versuche, den Controller Bootstrapping kann ich nicht httpBackend an die Arbeit:

describe('UserCtrl', function(){ 

    var ctrlScope, ctrl, $httpBackend, controllerService; 

    beforeEach(
     inject(function($httpBackend, $http, $rootScope, $controller, User, Config) { 
      _User = User; 
      _Config = Config; 
      spyOn(User, 'getUserInfo').andCallThrough(); 
      //spyOn(User, 'query').andCallThrough(); 

      ctrlScope = $rootScope.$new(); 
      controllerService = $controller; 
      httpMock = $httpBackend; 

     }) 
    ); 

    it('should create setup userinfo object ', function() { 
     httpMock.expectGET("/user/default/details"). 
      respond({somejson}); 

     ctrl = controllerService('UserCtrl', {$scope: ctrlScope, $location: location, User: _User, Config: _Config}); 
     expect(_User.getUserInfo).toHaveBeenCalled(); 
     httpMock.flush(); 
     expect(ctrlScope.userinfo.length).toBe(1); 

    }); 
}); 

Alles, was ich jemals bekommen ist:

Error: No pending request to flush ! 

so ist es möglich, mit einem Service zu nutzen httpBackend, die Sie von einem Controller aufgerufen haben Sie testen?

+0

Wo ist getUserInfo definiert? Es scheint, als ob deine Methode immer noch 'Query' genannt wird? – Rafi

Antwort

1

Gibt es einen Grund, dass Sie speziell für eine GET-Anfrage testen möchten? Dies ist ein Implementierungsdetail Ihres Benutzerdienstes.

Unabhängig davon, ob Ihre Funktion query() oder getUserInfo() aufgerufen wird, vermute ich, dass alles, was Sie wirklich wissen möchten, ist, dass die Funktion in Ihrem Benutzerdienst aufgerufen wurde. Es ist Sache des Benutzerdienstes, über eigene Tests zu verfügen, die prüfen, ob eine GET-Anfrage an/user/defaults/details gestellt wurde.

Der Grund dafür ist, dass Sie nicht möchten, dass unabhängige Komponententests nicht ausgeführt werden, wenn Sie die Implementierung Ihres Benutzerdienstes ändern. Was passiert, wenn sich Ihre API in /user/query ändert? Ihre UserCtrl-Tests sollten nicht unterbrochen werden, noch sollte ein anderer Controller den Benutzerservice verwenden. Wenn Ihre UserCtrl getUserInfo() für den Benutzerdienst aufruft, macht sie das Richtige für Sie. Die Tests Ihrer Benutzerserviceeinheit werden unterbrochen und sobald Sie sie reparieren, um auf Ihre neue URL zu verweisen, ist alles wieder in Ordnung.

+0

Ich wollte das gleiche denken und stundenlang versuchen, ein ähnliches Szenario zu testen. Danke für die Antwort, es hat eine Menge Dinge geklärt –

Verwandte Themen