QUnit:每个方法一个测试,每个方法有多个断言或多个测试?

时间:2011-10-19 14:29:00

标签: javascript unit-testing qunit

我决定为我的下一个javascript项目开始TDD,我正在使用QUnit进行单元测试。我完全不熟悉单元测试,从未使用过任何语言。以下是我的一个模块的示例以及find方法的一个测试,该方法试图涵盖此方法将遇到的所有方案:

module("TextSwapper", {
    setup: function() { 
        this.str = 'When you first start off trying to solve a problem, the first solutions you come up with are very complex, and most people stop there. But if you keep going, and live with the problem and peel more layers of the onion off, you can often times arrive at some very elegant and simple solutions.';

        this.ts = new TextSwapper();
        ok(this.ts, 'The TextSwapper was created successfully');

        this.textarea = document.createElement('textarea');
        this.textarea.value = this.str;
        document.body.appendChild(this.textarea);
    },
    teardown: function() {
            document.body.removeChild(this.textarea);
    }
});

test("find()", function() {
    equal(this.ts.find('When'), false, "Check it fails gracefully when no input has been set.");
    this.textarea.focus();
    equal(this.ts.find('When'), true, "Check it finds 'When' if the textarea has focus but no input has been set.");

    this.ts.setInput(this.textarea);
    this.ts.find('When');
    equal(window.getSelection().toString(), 'When', 'The word \'When\' should be highlighted');
    equal(this.ts.found[0][0], 'When', 'The word \'When\' should be in the found array');

    this.ts.find('you');
    equal(window.getSelection().toString(), 'you', 'The word \'you\' should be highlighted');
    equal(this.ts.found[1][0], 'you', 'The word \'you\' should be in the found array');
    equal(this.ts.found.length, 4 ,'Should have found 4 you\'s');

    this.ts.find('bill');
    equal(this.ts.found.length, 0, 'Check that nothing was found for \'bill\'');

    this.ts.find('[a-z]*ee[a-z]*');
    equal(window.getSelection().toString(), 'keep', 'The word \'keep\' should be highlighted');
    equal(this.ts.found[1][0], 'peel', 'The word \'peel\' should be in the found array');
    equal(this.ts.found.length, 2 ,'Should have found 2 for [a-z]*ee[a-z]*');

});

我的问题是我是以正确的方式解决这个问题吗?我的测试中有太多断言吗?我的测试应该分解成更小的测试吗?我一直在阅读关于stackoverflow的TDD,现在我已经阅读了一些让我觉得我做错了的事情。

2 个答案:

答案 0 :(得分:5)

如果您正在使用TDD,那么您应该针对每种测试方法进行一次断言。

以下链接很好地解释了在一种方法中测试所有内容时可能遇到的问题:Unit testing它可能更容易在代码中引入隐藏的错误。

答案 1 :(得分:0)

如果您能找到Bob Martin"清洁代码"的副本,他会在单元测试一章中讨论这个问题。他的观点是"每次测试一个断言"可能有点尴尬(他在书中给出了一个很好的例子),他更喜欢为每个测试拍摄一个概念"代替。因此,如果您认为它们密切相关并且分离会很烦人,请继续使用多个断言。