7

このようなディレクティブがあれば

JS:

app.controller('MyController', function($scope) {
  this.someMethod = function() {
  };
});

app.directive('myDirective', function() {
  return {
    scope: true
    link: function(scope, elem, attrs, controller) {
      controller.someMethod();
    }
    controller: 'MyController',
  }
});

Jasmine スパイを作成して、リンク関数が呼び出されるようにしたいのですcontroller.someMethodが、これは機能しません。

仕様:

var elem = angular.element('<div my-directive></div>');
var scope = $rootScope.new();
$compile(elem)(scope);

var ctrl = elem.controller('myDirective');
spyOn(ctrl, 'someFunc').andCallThrough();

$compileコントローラーがインスタンス化され、リンク関数がステートメントで呼び出されたため、スパイの作成が遅すぎます。

リンク関数で発生したことをスパイする他の方法はありますか? コントローラーを事前にインスタンス化してに渡すことは可能$compileですか?

4

1 に答える 1

7

Directives に関する AngularJS Developer Guide のページから:

ベスト プラクティス: API を他のディレクティブに公開する場合は、コントローラーを使用します。それ以外の場合は、 link を使用してください

何のためにもサービスを作成することをお勧めsomeMethod()します。次に、そのサービスをモックしてスパイできます。そうでなければ、あなたが望んでいたことが実際に起こったという他の兆候を探す必要があるかもしれません.

于 2014-03-14T16:40:08.897 に答える