2013-09-04 3 views
6

Presenterò questa domanda dicendo che ho già ottenuto un test per il mio "LoginCtrl" che esegue quasi esattamente lo stesso compito. Sono sicuro che questo è un problema di qualcosa di veramente piccolo che ho trascurato. Grazie in anticipo per qualsiasi aiuto :)

Ho impostato il valore atteso/risposta per httpBackend per il mio test, ma quando corro httpBackend.flush(), è come se non avessi mai impostato l'aspettativa.

codice Testing:

describe('user register', function() { 
    var scope, RegisterCtrl, httpBackend, userJohnDoe, userJohnDoeRegistered, Restangular; 


    // TEST 
    beforeEach(module('LR.User.Register')); 


    describe('RegisterCtrl', function() { 
     beforeEach(inject(function ($controller, _$httpBackend_, $rootScope, _Restangular_, $state) { 
      scope = $rootScope.$new(); 
      httpBackend = _$httpBackend_; 
      Restangular = _Restangular_; 

      // Models 
      userJohnDoeRegistered = { 
       "access_token": "YzEyZDhjNjBlY2EwMTMxMmQzZGIzYWY5NDY4OGYwMjMzMGVjNDU3MDVhY2U0YjJmNDc1ODI3NWU0ODkzZGNkMQ", 
       "expires_in": 7200, 
       "token_type": "bearer", 
       "scope": null, 
       "refresh_token": "MmFhMTQ5NzU4ODI5ZjE2Mjk3ZjNlYzEwYzJkMjc4M2NkZjY2MjVkMjIwNWQzODUxYWNiYzY3NzIyMzEwYzJhNg", 
       "user": { 
        "username": "johndoe", 
        "email": "[email protected]", 
        "id": 1, 
        "first_name": "John", 
        "middle_name": "f", 
        "last_name": "Doe", 
        "created": "2013-09-04T10:46:10-0500", 
        "updated": "2013-09-04T10:46:10-0500" 
       }, 
       "status": "success", 
       "status_code": 200, 
       "status_text": "OK" 
      }; 
      userJohnDoe = { 
       "email": "[email protected]", 
       "first_name": "John", 
       "middle_name": "f", 
       "last_name": "Doe", 
       password: 'test123X', 
       passwordSecond: 'test123X', 
       client_id: '1_3b5zgimwg4kkko4wksk4sw0o48040o8ws8og8kg4wsowwkc44s' 
      }; 

      httpBackend.whenPOST('/register', userJohnDoe).respond(userJohnDoeRegistered); 


      RegisterCtrl = $controller('RegisterCtrl', {$scope: scope, $state: $state, Restangular: Restangular}); 
     })); 
     afterEach(function() { 
      httpBackend.verifyNoOutstandingExpectation(); 
      httpBackend.verifyNoOutstandingRequest(); 
     }); 


     it('should be able to register a fake user', inject(function() { 
      var resolvedRegistration; 
      var cb = function (response) { 
       // Expect the userJohnDoe object 
       resolvedRegistration = sanitizeRestangularOne(response); 

       console.log(logTestHeader('REGISTRATION RESPONSE') + 
        JSON.stringify(resolvedRegistration, null, ' ')); 
      }; 

      // Set credentials 
      scope.user = userJohnDoeCredentials; 

      // Call login 
      var register = scope.register_user().then(function() { 
       cb(); 
      }); 
      scope.$digest(); 
      httpBackend.flush(); 
      expect(resolvedRegistration).toEqual(userJohnDoeRegistered); 
     })); 
    }); 


}); 

risposta in uscita:

Chrome 29.0.1547 (Mac OS X 10.8.4) user register RegisterCtrl should be able to register a fake user FAILED 
    Error: Unexpected request: POST /register 
    No more request expected 
     at Error (<anonymous>) 
     at $httpBackend (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular-mocks/angular-mocks.js:959:9) 
     at y (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:64:282) 
     at g (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:62:272) 
     at r (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:96:140) 
     at r (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:96:140) 
     at /Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:97:293 
     at Object.g.$eval (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:104:502) 
     at Object.g.$digest (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:102:419) 
     at null.<anonymous> (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:74:19) 
    Error: Declaration Location 
     at window.jasmine.window.inject.angular.mock.inject (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular-mocks/angular-mocks.js:1781:25) 
     at null.<anonymous> (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:57:54) 
     at null.<anonymous> (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:9:5) 
     at /Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:1:1 
+0

Calcolato il problema, vedere la mia risposta per informazioni. –

risposta

1

Ho scoperto di cosa si trattava. la mia funzione register_user() faceva riferimento a $scope.user, che era impostata su una variabile non definita: userJohnDoeCredentials (un nome di variabile diverso che avevo usato per il mio test precedente).

Non sono sicuro del motivo per cui il mio IDE non si è lamentato del fatto che io facessi riferimento a una variabile indefinita, e passava tutti i miei test di jslint, quindi è strano anche a me, ma a me. È stato risolto: D Solo se ora potessi ottenere la richiesta di risposta per restituire quello che voglio ...

+0

Contento di averlo risolto. Sento il tuo dolore per i mock. Sono un animale completamente diverso. – MBielski

3

Il mio primo pensiero è che qualcosa sta facendo una richiesta quando si istanzia il controller. Forse prova ad aggiungere $ httpBackend.flush() dopo la riga di dichiarazione del controllore e vedi se lo risolve. Inoltre, il tuo $ scope. $ Digest dovrebbe essere dopo $ httpBackend.flush anziché prima?

+0

Provato a spostare la chiamata 'flush()', ma ogni volta che viene chiamata prima di 'digest()' Ottengo una "Nessuna richiesta in sospeso per svuotare!" errore. Mi sembra che la mia dichiarazione 'httpBackend.whenPOST' non stia sparando per qualsiasi motivo –

+1

Per impostazione predefinita il mio controller chiama un metodo di richiesta che è ciò che causa questo problema per me. –