将迭代和逻辑放入测试中是错误的吗?

时间:2012-06-07 19:10:20

标签: javascript unit-testing

在问题中,我的测试应该尽可能简单,还是应该包含一些模仿我正在测试的函数逻辑的逻辑?
举个例子,我正在测试这个函数:

$( 'ul.nav-tabs a' ).click( event_handlers.handle_set_tab_cookie );

var handle_set_tab_cookie = function( e ) {
    var active = $( this ).attr( 'href' );
    $.cookie( 'feeds_active_tab', active );
};

我的测试应该是这样的愚蠢:

describe( "Facebook Feeds page", function() {
    beforeEach( function() {
        $( 'ul.nav' ).remove();
        var html = $('<ul class="nav nav-tabs"><li class="active"><a data-toggle="tab" href="#facebook">Facebook Feeds</a></li><li class=""><a data-toggle="tab" href="#ics">ICS</a></li></ul>');
        $('body').append( html );
    } )
    it( "Should call jQuery cookie to save the href ", function() {
        // Set up the listeners
        page.start();
        // Set up spies
        spyOn($, 'cookie');
        // Start the test
        var a = $( 'a[href=#facebook]' );
        a.trigger( 'click' );
        // verify that it has been called with the correct parameter
        expect($.cookie).toHaveBeenCalled();
        expect($.cookie).toHaveBeenCalledWith('feeds_active_tab', '#facebook'); 
    } );
    afterEach( function() {
        $( 'ul.nav' ).remove();
    } );
} );

或者有一些迭代/逻辑,以便我一次完成所有测试?

describe( "Facebook Feeds page", function() {
    beforeEach( function() {
        $( 'ul.nav' ).remove();
        var html = $('<ul class="nav nav-tabs"><li class="active"><a data-toggle="tab" href="#facebook">Facebook Feeds</a></li><li class=""><a data-toggle="tab" href="#ics">ICS</a></li></ul>');
        $('body').append( html );
    } )
    it( "Should call jQuery cookie to save the href ", function() {
        // Set up the listeners
        page.start();
        // Set up spies
        spyOn($, 'cookie');
        // Start the test and iterate over all the links
        $( 'ul.nav a' ).each( function(i, el) {;
                $(el).trigger( 'click' );
                // verify that it has been called with the correct parameter
                expect($.cookie).toHaveBeenCalled();
                expect($.cookie).toHaveBeenCalledWith('feeds_active_tab', $(el).attr('href'); 
                    } ); 
    } );
    afterEach( function() {
        $( 'ul.nav' ).remove();
    } );
} );

1 个答案:

答案 0 :(得分:2)

更复杂的测试:

  1. 难以维护
  2. 不能用作文档
  3. 更难以阅读,软件的阅读频率高于其编写的内容
  4. 写错的概率较高(谁来测试我们的测试?)
  5. 可能会在TDD期间破坏您的api设计
  6. 另一方面,编写覆盖整个功能的单个测试然后编写12个小测试会更容易,更快捷。这就是为什么这种方式通常会获胜。总结一下:如果你的项目计划长寿,我会写出最小和最简单的测试。它的要求更高,但未来会盈利