私のニーズに合った他の質問/回答が見つからなかったので、ここにあります:
AngularJS (1.2.14) コントローラーには、イベント ('fetchData') が発生したときに ajax 呼び出しを実行してデータをフェッチするイベント リスナーがあります。フェッチが成功すると、イベント ('fetchSuccess' と呼ばれる) がブロードキャストされ、ディレクティブがリッスンします (ただし、その部分は関係ありません)。
$scope.$on('fetchData', function () {
$scope
.submitSearch()
.then(function (results) {
$scope.$broadcast('fetchSuccess');
}, function () {
$scope.$broadcast('fetchError');
});
});
したがって、私のテストでは、次のようなことをしたいと考えています (「this.scope」は、テスト スイートのコントローラーの新しい $scope オブジェクトであると仮定します)。
it('should broadcast "fetchSuccess"', inject(function ($rootScope) {
var scope = this.scope,
spy = chai.spy(scope, '$broadcast');
// trigger the $broadcast event that calls the fetch method
scope.$broadcast('fetchData');
$rootScope.$apply();
expect(scope.$broadcast).to.be.called.with('fetchSuccess');
}));
しかし、アサーションで $broadcast イベントをリッスンする方法がよくわかりません。このエラーが発生し続けます: AssertionError: expected function (name, args) {...}
明確にするために、私の問題は、実行時のイベント ブロードキャスターまたはリスナーの機能に関するものではありません。アプリケーションは期待どおりに動作します。問題は、テスト スイートでイベントをリッスンすることです。
上記のコードは、この質問に必要なスニペットにすぎないことに注意してください。私のアプリケーションには、設定/呼び出される他の変数/メソッドがあり、それらは正しくテストされます。つまり、実際の取得メソッドが呼び出されるかどうか、または特定の変数が適切に設定されているかどうかをテストすると、それらのテストはパスします。
スコープ変数を混ぜ合わせて一致させ、 $broadcast 経由でリッスンすることさえ試みましたが、何も機能してscope.$on('fetchSuccess', fn)
いないようです。fetchSuccessイベントが発行されないようです。または、適切にリッスンしていません。
前もってありがとう、ライアン。