2017-05-08 4 views
0

테스트 파일을 테스트에 도착 :

describe('$rootScope', function() { 
    describe('$on', function() { 
     var credentials = "Basic abcd1234"; 
     var $scope; 
     var $rootScope; 
     var $httpBackend; 
     ... 
     beforeEach(inject(function($injector, $controller, _$rootScope_, $state, _$q_, currentUserService) { 
      $scope = _$rootScope_.$new(); 
      $rootScope = _$rootScope_; 
      $httpBackend.when('GET', 'dist/app/login/login.html').respond({'title': 'TEST_TITLE'}, {'A-Token': 'xxx'}); 
     })); 

     ... 
     it('should set $scope.title if noAuthorization', function() { 
      spyOn($rootScope, '$on'); 
      $controller('AppCtrl', {$scope: $scope}); 
      $rootScope.$broadcast("$stateChangeStart"); 
      $rootScope.$apply(); 

      expect($rootScope.$on).toHaveBeenCalled(); 
      expect($scope.title).toBe('TEST_TITLE'); 

     }); 
    }); 
}); 

$의 scope.title가 항상 내 테스트에 정의되어 있지 않습니다. 기대는 항상 실패합니다. $ emit, $ apply 등을 시도했다. 이것은 $ rootScope.on 메소드 내부의 컨트롤러 내에있다.

하지만 jscript 파일 안에 $ scope.title을 기록하면 $ scope.title에 업데이트 된 것으로 표시됩니다.

나는 또한 내가 실제 코드는 않기 때문에이 작업의 쇼하는 것이 필요하다 생각하지 않습니다 단지 function updateTitle(...)

, 그것은 $scope.updateTitle이없는 즉, 호출되는 함수가 $ 범위에없는 것을 언급해야한다 . 테스트에서 $ 범위가 업데이트되지 않는 이유가 궁금합니다.

답변

-1

간단히 말해서 : 스파이에 .andCallThrough()을 잊지 마세요. 재스민 스파이는 andCallThrough()이 필요했습니다. 올바른 범위에 액세스하려면 element.scope()을 사용하십시오.

spyOn(scope, '$apply').andCallThrough(); 
+0

행운이 없습니다. 아무것도하지 않습니다. $ on과 $ apply에 callThrough (()를 두었지만 아직 정의되지는 않았습니다. – Tai