3

我在测试我的 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”变量添加到默认值。我用下面的代码修复了它,但是复制一个副本看起来不是很优雅。

$(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 命名空间中有一些对象,如果我必须为每个对象获取多个副本,它可能会变得有点混乱。所以想知道是否有人有更好的解决方案来“重置”所有对象?

4

2 回答 2

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 );
});
于 2010-12-20T08:36:49.933 回答
0

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

例如 $(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();
    });

}

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

于 2011-01-13T11:16:40.163 回答