我应该在Jasmine中编写单元测试?

时间:2013-08-06 09:21:48

标签: javascript maven jasmine jasmine-maven-plugin

我在系统生命周期中反向工作。几个月前我写了一个大型的JavaScript库。然后我必须把它全部变成目标,现在,我必须为它编写单元测试。我正在使用Maven并在我的pom.xml中有jasmine-maven-plugin。我遇到的问题是我应该为什么编写测试,以及有多少。

这第一个例子很简单。该函数接受一个字符串并返回第一个字母大写。

var toolsFn = {
    capitaliseFirstLetter: function(string) {
        return string.charAt(0).toUpperCase() + string.slice(1);
    }
},

所以我的单位测试它:

describe("toolsFn - capitaliseFirstLetter", function() {
    it("capitalises the first letter of a given string", function() {
        expect(toolsFn.capitaliseFirstLetter("hello World!")).toBe("Hello World!");
    });
});

但是,我不确定我应该为我的许多其他方法做些什么。他们中的大多数处理html代码,例如更改选项卡,显示通知,禁用/启用控件。我应该只期望方法toHaveBeenCalled还是更多呢?

请查看以下示例,这些示例更改标签,加载指定标签并隐藏通知;

tabsFn = {
    changeTab: function() {
        $(tabButtons).addClass('inactive');
        $(tabContent).hide();
        $(this).removeClass('inactive');
        var tab = $(this).attr('tab');
        $('.tab-content-' + tab).show();
        return false;
    },
    loadTab: function(tab) {
        $(tabButtons).addClass('inactive');
        $(tabContent).hide();
        $('[tab~="' + tab + '"]').removeClass('inactive').removeAttr('disabled');
        $('.tab-content-' + tab).show();
    },

messageFn = {
    hideNotification: function(time) {
        $(messageFn.notificationBar).stop(true, true).fadeOut(time);
    },

非常感谢任何澄清。

1 个答案:

答案 0 :(得分:2)

  

他们中的大多数处理html代码,例如更改标签,显示通知,禁用/启用控件。

您要验证的是,结果行为是否正确(例如:内容已更改)。这通常通过集成测试完成,而Jasmine不是集成测试的最佳工具。像Selenium这样的工具可以做得更好。

只是不要陷入开始测试是否调用特定函数来验证功能是否仍然正常工作的陷阱。该功能的内部可以改变并调用其他功能,这并不意味着它现在已被破坏。这就是为什么最好在更高层次上进行(集成测试)。

  

我遇到的问题是我应该为什么编写测试,以及有多少

通常,您为每个不打算更改应用程序状态的函数编写单元测试。您的大写功能是单元测试功能的一个很好的例子。

至少有多少,这取决于您现在编写单元测试的时间以及将来必须维护它们的时间。您还必须记住每个测试的有用性。如果您正在测试的内容过于琐碎,那么进行单元测试可能没有任何价值。如果你有足够的时间,测试函数的一个好方法就是为每个边缘情况设置一个测试用例(在你的第一个字母大写的例子中,一个很好的例子是空字符串,null或undefined)和对一般情况的测试。这将导致每个功能大约2-4次测试。有了这个,你通常可以很好地覆盖你的代码。