2016-07-16 28 views
0

任何人都可以幫助我解決以下情況,如何使用karma angular來實現此目的。 $ 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 ARGS的呢? – Mithun

+1

@Hansie你可以傳遞任何你想回調的東西。當像上面的例子那樣提取時,它只是一個正常的功能。沒有什麼比其他任何不同。在你的特定情況下,你必須從狀態傳遞,否則fromState.name.match('test.abc')會拋出異常。 – sielakos

+0

謝謝你,對於最後一個愚蠢的問題感到抱歉。那個參數可以是一個數組嗎?我需要將'事件,狀態,toParams,fromState'傳遞給我。我是如何徹底地通過這一切?要麼通過數組?並且事件應該被窺探或者通過創建一個使用var event = scope的外部模擬來傳遞。$ broadcast('click');'plz clarrify – Mithun