如何在 Jasmine 的 angular 指令中监视 jquery 函数

How to spyon jquery function inside angular directive in Jasmine

指令

         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();
       });

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

它不会工作,因为你试图监视 mouseover 方法,它在指令 link 函数中只被调用一次,并且你在这个方法已经被调用之后安装监视 - 时刻您安装了 spy spied 函数已经被调用,所以 spy 不知道这一点。
我建议不要测试 mouseover 本身是否被调用但是如果 mouseover 回调在事件被触发时被调用 - 你实际上这样做是因为你监视 tooltip 方法(你的错误消息表明你监视工具提示方法)。因此,只需删除此测试,因为它是 pointles。我假设您想测试是否调用了鼠标悬停回调,而不是是否调用了 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();
 });