如何在Jasmine中的angular指令内部使用jquery函数

时间:2017-04-05 06:32:23

标签: javascript jquery angularjs jasmine jasmine-jquery

指令

         link(scope, element, attrs, ctrl) {    

            element.mouseover(function() {
                $(element).tooltip('show');
            });
            $(element).hover(MuiBootstrap.adjustTooltips);
        }

茉莉花测试

       it('should show tooltip on mouseover', function () {
         var spy = spyOn(element, 'mouseover');
         $(element).trigger('mouseover');
         expect(spy).toHaveBeenCalled();
       });

以上的茉莉花测试失败了      错误:未被捕获的预期间谍工具提示已被调用。

1 个答案:

答案 0 :(得分:0)

由于你试图窥探在mouseover函数中只调用一次的link方法,并且在调用此方法之后安装spy - 安装的那一刻,它将无法工作间谍间谍功能已经被调用,所以间谍不知道这一点 我建议不要测试mouseover本身是否被调用,但是如果在触发事件时调用了mouseover回调 - 你实际上是因为你监视tooltip方法而做的(你的错误信息表明你窥探工具提示方法)。因此,只需删除此测试即可。我假设你想测试是否调用了mouseover回调而不是调用了mouseover方法 - 这两个是不一样的。

回答更新 要测试mouseover回调,您可以在指令范围上定义此回调:

link(scope, element, attrs, ctrl) {    
    scope.mouseoverCallback = function() {
        $(element).tooltip('show');
    };
    element.mouseover(scope.mouseoverCallback);
}

然后直接在其上安装spy:

 it('should call mouseover callback', function () {
     var yourDirectiveScope = element.scope();
     var spy = spyOn(yourDirectiveScope, 'mouseoverCallback').and.callThrough();
     element.triggerHandler('mouseover');
     expect(yourDirectiveScope.mouseoverCallback).toHaveBeenCalled();
 });