次のように定義された、Angular アプリにイベント リスナーを持つコントローラーがあります。
angular.module('test').controller('TestCtrl', function($rootScope, $scope, testService) {
[...]
$scope.$on("myEvent", function(args, value) {
testService.doStuff(value);
});
});
これは、アプリ自体で完全に機能します。ただし、コントローラーの機能を ( JasmineとKarmaを使用して) 単体テストしようとすると、各テスト メソッドで次のエラーがスローされます。
TypeError: $scope.$on is not a function in [...]/testController.js
次のように、テスト メソッドでコントローラーを作成します。
it('does stuff', inject(function($rootScope, $controller, testService) {
var scope = $rootScope.$new;
$controller('TestCtrl', {
$scope : scope
});
[...]
}));
rootScope
代わりにコントローラーを使用するように変更することで、問題を回避できます。
$rootScope.$on(...)
しかし、もちろん、アプリは期待どおりに機能しなくなります。$on
テスト コードにメソッドを導入することで、エラーを取り除くこともできます。
var scope = $rootScope.$new;
scope.$on = function() {};
しかし、この種のリスナーを嘲笑することは、私の実際のコードをテストする目的を無効にします。
$on
テスト コードが のメソッドを 見つけられないのはなぜscope
ですか? (しかし、それを見つけますrootScope
、それでも...)
ここで欠けている基本的なものがあるに違いありませんが、Angular のソース コードを何度もグーグルで調べたり読んだりした後でも、それを理解できませんでした。