如何在链接阶段测试指令?

时间:2015-05-02 20:10:45

标签: angularjs unit-testing angularjs-directive karma-runner karma-mocha

以下是一些Javascript,它在AngularJS指令的trigger函数内调用jqLit​​e的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的{​​{1}}参数?

编辑:我对link间谍的评论似乎引起了混乱。我只是暗示,如果解决方案需要将element添加到传递给element的参数,那就没问题了。但是目前我没有用它,这就是为什么它被排除在参数列表之外。

1 个答案:

答案 0 :(得分:1)

嘲笑trigger函数,你可以监视element的事件函数,因为@Michael Benford表示你没有在代码示例中使用element ,考虑到你的问题,似乎有点困惑:

此示例使用ChaiJS作为断言工具,使用SinonJS作为间谍/存根/模拟库您应该在spy 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;
});

我希望这适合你。