Qunit:测试泄漏

时间:2010-12-04 15:38:42

标签: javascript jquery qunit

我在测试我的jQuery插件时遇到了泄漏问题。当我想在文字对象上模拟一个值或函数时会出现问题。

示例:

test('Overwrite some default setting', function(){
    $.fn.plugin.defaults.bar = 'foo';
});

test('Bar should be undefined', function(){
    equals( $.fn.plugin.defaults.bar, undefined );
});

此测试将失败,因为第一个测试将'bar'var添加到默认值。我使用以下代码修复它,但是复制副本看起来并不优雅。

$(function(){

    /*
     * Trolley Button Base: Options.
     */

    var defaults_copy = $.extend({}, $.fn.plugin.defaults );

    var setdown = {
        setup : function(){
            $.fn.plugin.defaults = $.extend({}, defaults_copy);
        },

        teardown : function(){ }
    };

    module('Test leakage', setdown );

    test('Overwrite some default setting', function(){
        $.fn.plugin.defaults.bar = 'foo';
    });

    test('Bar should be undefined', function(){
        equals( $.fn.plugin.defaults.bar, undefined );
    });

})

如果我在jQuery命名空间中有一些对象,如果我必须为每个对象获取多个副本,它可能会变得有点乱。所以有人想知道有没有更好的解决方案来'重置'所有对象?

2 个答案:

答案 0 :(得分:2)

这是QUnit的设计。在每次测试结束时,您应该清理您所做的任何状态更改。我不知道自动执行此操作的方法 - 您必须编写代码来撤消您编写的任何测试代码的效果,如下所示:

test('Overwrite some default setting', function(){
    // test code
    $.fn.plugin.defaults.bar = 'foo';

    // cleanup code
    delete $.fn.plugin.defaults.bar;
});

test('Bar should be undefined', function(){
    equals( $.fn.plugin.defaults.bar, undefined );
});

答案 1 :(得分:0)

为了防止测试订单依赖性问题并完全隔离单元测试,您需要通过为每个测试创建一个函数并在每个测试的开头和结尾包含它来手动实现测试级别设置和拆除功能。方法:

e.g。     $(document).ready(function(){

    // Test Setup/TearDown
    function codeUnderTestModuleTestSetup() {
        //any setup needed
    }

    function resetDefaults() {
        //code in here to reset defaults
    }

    function resetSomethingElse() {
        //code in here to reset something else
    }

    function codeUnderTestModuleTestTearDown() {
        resetDefaults();
        resetSomethingElse();
    }

    //Tests
    module('Your module title Test Harness');    

    test('FunctionUnderTest_Behaviour_ExpectedResult', 1, function () {
        codeUnderTestModuleTestSetup();

        //Arrange
        //code removed

        //Act
        //Code removed

        //Assert
        //Code removed

        codeUnderTestModuleTestTearDown();
    });

}

如有必要,您也可以手动实现模块级别和测试运行级别设置和拆卸功能。