3

以下は、AngularJS ディレクティブtriggerの関数内でjqLit​​e を呼び出す Javascript です。link

angular.
  module('myApp').
  directive('myDirective',
    function($timeout) {
      return {
        link: function(scope) {

          scope.resetChosenElements = function() {
            $timeout(function() { 
                $('[chosen]').trigger('chosen:updated'); 
            }, 0);
          }

          scope.resetChosenElements();          

        }
      };
    }
  );

triggerスパイせずにディレクティブが作成されたときに呼び出されることを確認するテストを作成するにはどうすればよい$.triggerですか? $.trigger(他のディレクティブからの呼び出しも含め、すべての呼び出しをキャッチするため、スパイしたくありません)。

elementに渡すことができる引数をスパイする方法はありlinkますか?

編集:スパイについての私のコメントはelement混乱を引き起こしているようです. elementソリューションが渡された引数に追加する必要がある場合は、それで問題ないことを暗示しているだけですlink。ただし、現在、それ以外の用途はありません。そのため、引数リストから除外されています。

4

1 に答える 1

1

@Michael Benfordがコード例で使用していないと言ったように、triggerあなたがスパイできる関数をモックするRathenは、あなたの質問を考えると混乱しているようです:elementelement

この例では、アサーション ツールとして ChaiJSを使用し、spies/ stubs /mocks ライブラリとしてSinonJSspyを使用していますelement customEvent

beforeEach(inject(function($rootScope, $compile, _$httpBackend_) {
    $scope = $rootScope.$new();
    compile = $compile;
    $httpBackend = _$httpBackend_;
    el = angular.element('<elementTemplateTag></elementTemplateTag>');
    compile(elm)($scope);
    spy = sinon.spy(el, "customEvent"); // Add spy on the event call
}));

afterEach(function(){
 el.customEvent.restore(); //clean spy calls
});

it('element.customEvent() called once', function() {

    el.trigger('customEvent');
    $timeout.flush(); // release all timeouts

    expect(el.customEvent.calledOnce()).to.be.true;
});

これがうまくいくことを願っています。

于 2015-05-03T01:00:54.967 に答える