回答

119

如果你只是需要對事件觸發和捕捉進行一些測試,我就是這麼做的。爲確保某個事件被激發($emit -ed或$broadcast -ed),間諜是要走的路。你需要將被調用$emit$broadcast,然後只是做這樣的事情的範圍參考:

spyOn(scope, "$emit") 
//run code to test 
expect(scope.$emit).toHaveBeenCalledWith("MY_EVENT_ID", other, possible, args); 

如果你不需要或不想要擔心是參數通過$emit後,您可以在$rootScope上放置$on並設置標誌以瞭解事件是否已發出。事情是這樣的:

var eventEmitted = false; 
$rootScope.$on("MY_EVENT_ID", function() { 
    eventEmitted = true; 
}); 
//run code to test 
expect(eventEmitted).toBe(true); 

出於測試的功能,當事件被捕獲($on)中運行,這是一個更容易一些。只需從inject函數獲得$rootScope,然後發送所需的事件。

$rootScope.$broadcast("EVENT_TO_TEST", other, possible, args); 
//expects for event here 

現在,我想這個事件處理將在指令或控制器(或兩者)爲了設置指令測試中發生的事情,看到https://github.com/vojtajina/ng-directive-testing。有關設置控制器測試,請參見https://github.com/angular/angular-phonecat/blob/master/test/unit/controllersSpec.js#L27

希望這有助於您。

+0

這對於精確匹配很好,但是如何匹配參數的一個子集?例如,如果參數只是一個對象{p1:'yes',p2:'no'}不管p2是什麼(或者它是否存在),你會如何期待p1:'yes'?我知道那裏有'任何'茉莉花鍵盤,但這似乎是相反的 - 沒有足夠的控制。任何中間地帶,你可以期待只是你想要的參數? – 2013-12-21 06:48:33

+0

@LukeMadera茉莉花有'jasmine.objectContaining'。從文檔:jasmine.objectContaining適用於期望只關心實際對象中的某些鍵/值對的那些時間。 – 2014-11-17 14:06:52

+0

謝謝,但會有一種方法來使用茉莉花?例如:'expect(scope。$ emit.calls.argsFor(0)[0]).BeBe('MY_EVENT_ID');' – cameronroe 2015-01-18 17:47:26

0

下面是你應該遵循$廣播事件的角度JS

雖然inijecting初始化rootScope和範圍存根步驟如下給出:

var rootScope; 
var scopeStub = beforeEach(function() { 
    inject(function($rootScope, _$controller_) { 
     rootScope = $rootScope; 
     scopeStub = $rootScope.$new(); 
     $controller = _$controller_; 
    }); 
}); 

控制器創建使用rootScope像加薪事件後如下:

rootScope.$broadcast('eventName', parameter1); 
0

我們用這個sintax爲A1

=========== Controller ======== 
    var vm = this; 
    $scope.$on('myEvent', function(event, data){ 
     console.log('event number', data.id); 
    }); 
============ Test ============= 
it('should throw myEvent', function() { 
    var data = {}; 
    $scope.$broadcast('myEvent', {id:1}); 
    $scope.$broadcast('myEvent', {id:2}); 
    $scope.$broadcast('myEvent', {id:3}); 
}); 

============ Output ============ 
Chrome LOG: '--------------------------------------------' 
Chrome LOG: 'event number', 1 
Chrome LOG: 'event number', 2 
Chrome LOG: 'event number', 3