2016-07-16 4 views
0

누구나 아래의 시나리오를 통해 나를 업 그레 이드 할 수 있습니까? $ stateChangeSuccess는 콜백 함수 없이도 쉽습니다. 그러나 stateChangeStart를 찾기가 어렵습니다. 그 다음 할 수 있습니다 단순히 spyOn ($의 범위 '에 $'내부 컨트롤러 인 경우statechangestart의 테스트 케이스

 $scope.$on('$stateChangeStart', function (event, toState, toParams, fromState) { 
      if (fromState.name.match('test.abc') && ($scope.validate())) { 
       event.preventDefault();      
      } 
     }); 

다음과 같은 것을 시도,하지만 난 확실하지 않다, 내가 옳은 길을

var fromState = {name: 'test.abc'}; 
    var toState = {name: 'test.xyz'}; 

    scope.$on('$stateChangeStart'); 

    expect(scope.$on).toHaveBeenCalled(); 
    expect(fromState.name)toBe('test.abc'); 
     /* expect event prevent default? */ 

답변

1

에서 오전); 여기

은 간단한 예입니다 :

angular.module('app', []); 
 

 
angular 
 
    .module('app') 
 
    .controller('Example', function ($scope) { 
 
    $scope.$on('event', (event, args) => { 
 
     $scope.args = args; 
 
     event.stopPropagation(); 
 
    }); 
 
    }); 
 

 
describe('Example Controller',() => { 
 
    let Example; 
 
    let $scope; 
 
    
 
    beforeEach(module('app')); 
 
    
 
    beforeEach(inject(($controller, $rootScope) => { 
 
    $scope = $rootScope.$new(); 
 
    spyOn($scope, '$on'); 
 
    $scope.$on.and.callThrough(); 
 
    
 
    Example = $controller('Example', { 
 
     $scope 
 
    }); 
 
    })); 
 
    
 
    it('sets args on $scope when event is fired',() => { 
 
    const args = 'args'; 
 
    
 
    $scope.$emit('event', args); 
 
    
 
    expect($scope.args).toBe('args'); 
 
    }); 
 
    
 
    it('event callback stops propagation',() => { 
 
    const [, callback] = $scope.$on.calls.argsFor(0); 
 
    const event = jasmine.createSpyObj('event', ['stopPropagation']); 
 
    
 
    callback(event); 
 
    
 
    expect(event.stopPropagation).toHaveBeenCalled(); 
 
    }); 
 
});
<script src='https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.4.1/jasmine.js'></script> 
 
<script src='https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.4.1/jasmine-html.js'></script> 
 
<script src='https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.4.1/boot.js'></script> 
 
<script src='https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.5/angular.min.js'></script> 
 
<script src='https://code.angularjs.org/1.5.5/angular-mocks.js'></script> 
 
<link rel='stylesheet prefetch' href='https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.4.1/jasmine.css'>

+0

내가 그 안에 fromState, TOSTATE 인자들을 통과해야합니까? – Mithun

+1

@Hansie 콜백을 원하는 모든 것을 전달할 수 있습니다. 위의 예 에서처럼 추출하면 정상적인 기능입니다. 다른 어떤 것과도 다르지 않습니다. 특별한 경우에, 당신은 State.name.match ('test.abc')의 예외가 예외를 던지기 때문에 이것을 fromState에서 넘겨야 만합니다. – sielakos

+0

마지막 바보 같은 질문에 사과드립니다. args가 배열 일 수 있습니까? 나는'상태, toState, toParams, fromState'를 전달해야합니다. 이 모든 것을 얼마나 정확하게 받아들이겠습니까? 배열 중 하나? 그리고 이벤트는 'var event = scope. $ broadcast ('click ')을 사용하여 외부 모의 객체를 생성하여 스파이가되거나 전달되어야합니다. plz clarrify – Mithun