2010-12-04 120 views
3

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

实施例:

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

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

因为第一测试添加的“杆”变种默认此测试将失败。我用下面的代码修复了它,但是复制副本看起来不太优雅。

$(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

这是专为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

为了避免与测试顺序的依存关系问题并要完全隔离您的单元测试,您需要手动实现测试级别设置和拆除功能,方法是为每个测试方法创建一个函数,并在每个测试方法的开始和结束处包括该函数:

eg $(文件)。就绪(函数(){

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

} 

您可以手动执行模块级和试运行级别的安装和拆卸功能也一样,如果必要的。