2

我在我的 Angular 代码中的指令的链接函数中有以下构造(工具提示库可以在http://iamceege.github.io/tooltipster/下找到):

scope.$on(MY_EVENTS.DATA_RETRIEVED, function(event) {
    $timeout(function() {
        var badge = element.find('.tooltip-hook');

        badge.tooltipster({
            content: $('Default tooltip'),
            contentAsHtml: true,
            theme: 'tooltipster-light',
            functionBefore: function(origin, continueTooltipster) {
                continueTooltipster();

                origin.tooltipster('content', scope.getTooltip());
            }
        });
    });
});

我遇到的问题是,当我用 Jasmine 测试这段代码时,覆盖率报告者抱怨说,因为functionBefore我的测试没有涵盖通过的函数。

如何在显示工具提示之前使用 Jasmine 进行单元测试(这在技术上不是在测试我的代码,而是在测试工具提示代码)和(这是关于我的代码)以及函数内部的语句被执行? 为了测试后者,我必须对已经匿名的本地函数的参数进行监视。

我知道我可以使用 jasmine-jquery 插件模拟 mouseenter 事件,该插件应该会引发工具提示出现,但是如何functionBefore使用 Jasmine 单元测试来覆盖呢?

4

1 回答 1

4

首先,测试是否tooltipster调用该代码是没有意义的。正如您所说,测试框架是否正常工作是没有意义的。框架有(或应该有)自己的测试。

但是,您可以测试的是您传递给的函数是否tooltipster符合您的要求。

例如,您可以将tooltipster函数转换为spy

var badge = ...
var passedObject;

//we are using a spy to get the object that is being passed to tooltipster
spyOn(badge, 'tooltipster').andCallFake(function (obj) {
   passedObject = obj;
});

//TODO: wait for the $timeout function to be executed

var origin = jasmine.createSpyObj(...);
var continueTooltipster = jasmine.createSpy('continueTooltipster');

//now let's just test the function
passedObject.functionBefore(origin, continueTooltipster);
expect(continueTooltipster).toHaveBeenCalled();

这会起作用,但在这种情况下,我相信这不是你应该测试的东西。请注意,您应该测试有意义的东西,为了获得 100% 的覆盖率而测试所有内容是没有意义的。

于 2015-08-24T13:12:12.763 回答