2016-07-16 9 views
0

カルマを使ってこれを達成するには、以下のシナリオで誰も助けてくれますか? $ stateChangeSuccessは、コールバック関数がなくても簡単です。しかし、stateChangeStartには困難があります。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

それは内部のコントローラである場合は、あなたができるだけでspyOn($の範囲、「$」上);ここで

は簡単な例です:

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'を渡す必要があります。どのように私はこのすべてを渡すshud?配列によってどちらか?イベントはスパイするか、 'var event = scope。$ broadcast( 'click');' plz clarrify – Mithun