2013-09-04 2 views
6

저는 거의 동일한 작업을 수행하는 "LoginCtrl"에 대한 테스트를 이미 마쳤다고 말합니다. 나는 이것이 내가 간과했던 정말로 작은 무엇인가의 문제 다라고 확신한다. 어떤 도움을 미리 주셔서 감사합니다 :)

내 테스트를 위해 httpBackend에 대한 예상 값/응답을 설정했지만 httpBackend.flush()을 실행하면 기대치를 설정하지 않은 것처럼 보입니다.

테스트 코드 :

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


}); 

출력 응답 :

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

알아 낸 내용은 내 대답을 참조하십시오. –

답변

1

나는 그것이 무엇인지 알게되었습니다. 내 register_user() 함수가 정의되지 않은 변수 인 userJohnDoeCredentials (이전 테스트에 사용 된 다른 변수 이름)으로 설정되는 $scope.user을 참조했습니다.

내 IDE가 정의되지 않은 변수를 참조하는 것에 대해 불평하지 않는 이유를 잘 모르고 내 jslint 테스트를 모두 통과 했으므로이 역시 이상하지만 meh입니다. 그것은 고정되어있다 : D 나는 단지 내가 원하는 것을 돌려 줄 수있는 모의 요청을 얻을 수있을 때만 ...

+0

당신이 고칠 다행. 나는 너의 고통을 조롱 거리에서 느낀다. 그들은 완전히 다른 동물입니다. – MBielski

3

내 첫번째 생각은 당신이 당신의 컨트롤러를 인스턴스화 할 때 뭔가가 요청을하고 있다는 것입니다. 컨트롤러 선언문 뒤에 $ httpBackend.flush()를 추가하여 문제가 해결되는지 확인하십시오. 또한, $ scope. $ digest가 이전에 대신 $ httpBackend.flush 뒤에 있어야합니까?

+0

'flush()'호출을 시도했지만'digest()'전에 호출 될 때마다 "플러시 대기 요청이 없습니다!"라는 메시지가 나타납니다. 오류. 내 'httpBackend.whenPOST' 선언이 어떤 이유로 든 실행되지 않는 것 같습니다. –

+1

기본적으로 내 컨트롤러는이 문제를 일으키는 요청 메소드를 호출합니다. –