2010-12-04 156 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(); 
    }); 

} 

您可以手動執行模塊級和試運行級別的安裝和拆卸功能也一樣,如果必要的。