2016-07-16 10 views
0

Kann mir jemand mit dem untenstehenden Szenario helfen, wie man das mit Karma Angular erreicht. $ stateChangeSuccess ist einfach ohne eine Callback-Funktion. Aber schwierig für StateChangeStart.Testfall für Statechangestart

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

so etwas wie unten Probieren, aber ich bin nicht sicher, ich bin im richtigen Weg

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? */ 

Antwort

1

Wenn es innerhalb Controller ist, dann können Sie einfach spyOn ($ Umfang, ‚$ auf‘);

ist hier einfaches Beispiel:

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

Muss i fromstate, toState args in es passieren? – Mithun

+1

@Hansie können Sie übergeben, was auch immer Sie zurückrufen möchten. Wenn es wie im obigen Beispiel extrahiert wird, ist es nur eine normale Funktion. Nicht anders als alle anderen. In Ihrem speziellen Fall müssen Sie dies vonState übergeben, da sonst fromState.name.match ('test.abc') die Ausnahme auslöst. – sielakos

+0

danke, sorry für die letzte dumme Frage. Kann das Args ein Array sein? Ich muss 'event, toState, toParams, fromState' übergeben. Wie genau schätze ich das alles? Entweder durch Array? Und Ereignis sollte spioniert werden oder durch Erstellen eines externen Mock mit 'var event = scope. $ Broadcast ('click') übergeben werden;' plz clarrify – Mithun