1

我在系统生命周期中反向工作。几个月前,我编写了一个大型 javascript 库。然后我必须让它变得客观,现在,我必须为它编写单元测试。我正在使用 Maven 并jasmine-maven-plugin在我的 pom.xml 中有。我遇到的问题是我应该为什么编写测试,以及测试的数量。

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

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

任何澄清都非常感谢。

4

1 回答 1

2

它们中的大多数处理 html 代码,例如更改选项卡、显示通知、禁用/启用控件。

您要验证的是结果行为是否正确(例如:内容已更改)。这通常通过集成测试完成,而 Jasmine 并不是集成测试的最佳工具。Selenium 之类的工具会更好地完成这种测试。

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

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

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

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

于 2013-08-06T18:30:15.093 回答