Qunit: 测试泄漏

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

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

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

}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接