13

次のように定義された、Angular アプリにイベント リスナーを持つコントローラーがあります。

  angular.module('test').controller('TestCtrl', function($rootScope, $scope, testService) {

    [...]

    $scope.$on("myEvent", function(args, value) {
      testService.doStuff(value);
    });
  });

これは、アプリ自体で完全に機能します。ただし、コントローラーの機能を ( JasmineKarmaを使用して) 単体テストしようとすると、各テスト メソッドで次のエラーがスローされます。

 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 のソース コードを何度もグーグルで調べたり読んだりした後でも、それを理解できませんでした。

4

1 に答える 1

16

$rootScope.$new関数です。それを呼び出す必要があります ( $rootScope.$new()):

it('does stuff', inject(function($rootScope, $controller, testService) {
  var scope = $rootScope.$new();
  $controller('TestCtrl', {
    $scope : scope
  });

  [...]
}));

プランクの例: http://plnkr.co/edit/t1x62msmOQDkNItGzcp9?p=preview

于 2013-05-21T14:11:35.050 に答える