イベントが正しく送信またはブロードキャストされることをテストし、イベントを手動でトリガーする必要があります。
これを行う最良の方法は何ですか?
イベントの発生とキャッチに関するテストが必要な場合は、これがその方法です。特定のイベント($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
を$rootScope
に配置し、フラグを設定して、イベントが発行されました。このようなもの:
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 をご覧ください。
お役に立てれば。
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
以下は、angular JS
注入中に、以下のようにrootScopeとスコープスタブを初期化します。
var rootScope;
var scopeStub = beforeEach(function() {
inject(function($rootScope, _$controller_) {
rootScope = $rootScope;
scopeStub = $rootScope.$new();
$controller = _$controller_;
});
});
コントローラが作成された後、以下のようにrootScopeを使用してイベントを発生させます。
rootScope.$broadcast('eventName', parameter1);