答えて

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と合格した場合は、に、$onを置き、イベントが発生したことを知らせるフラグを設定することができます。このような何か:イベントがキャッチされたときに実行されるテスト機能($on)については

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

、それは少し簡単です。 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

を参照してください。コントローラはrootScopeなどを用いて昇給イベントを作成した後

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

:ここ

+0

これは完全一致には適していますが、引数の部分集合とはどのように一致しますか?たとえば、argsがただ1つのオブジェクト{p1: 'yes'、p2: 'no'}である場合、p2はどんなものでも(またはイベントが存在する場合)、p1: 'yes'私はジャスミンキーボードがあることを知っていますが、それは反対であるようです。あなたが望むargsだけを期待できる中盤? –

+0

@LukeMadera Jasmineには 'jasmine.objectContaining'があります。ドキュメントから:jasmine.objectContainingは、実際のオブジェクトの特定のキーと値のペアについてのみ期待している場合に使用します。 –

+0

ありがとうございますが、ジャスミンを使用する方法がありますか? tobe( 'MY_EVENT_ID'); ' – cameronroe

0

は、以下に示すようrootScopeとスコープのスタブを初期化inijectingながらあなたは、角JS

で$ブロードキャストイベントに従うべき手順です。以下の下:

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

我々はA1

このsintaxを使用しました
=========== 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 
関連する問題