2013-05-20 84 views
1

更新:這裏是我的問題的小提琴。該測試通過一次,失敗,下一次:處理幾個事件聽衆

http://jsfiddle.net/samselikoff/hhk6u/4/

問題是departmentsevents.on("userSet:company"),所以這兩個變量對事件作出響應。


這是關於單元測試的一般性問題。在我的應用程序中,某個事件被觸發,我的應用程序的其他幾個部分也會偵聽此事件。我想單獨測試每件作品,因爲它們執行的功能不同;但要做到這一點,我必須在每次測試中將事件關閉。

這會導致問題,因爲第一次測試必須觸發事件,觸發其他測試中的偵聽器。在仍然測試多個事件偵聽器的情況下,如何保持測試的原子性?

(我正在使用QUnit,但我認爲這是一個更一般的單元測試問題)。

答:

Jeferson是正確的。解決這個問題的一個簡單方法是使用events.once而不是events.on。這樣你就可以從每個測試中清理你的事件。

回答

1

所有對異步方法的調用都應該使用「asyncTest」方法進行測試,並確保將調用包裝在其他調用QUnit.start()的函數中,以便可以收集和分析斷言數據。

我更新您的jsfiddle有工作代碼:http://jsfiddle.net/hhk6u/8/ 新的代碼是:

QUnit.config.autostart = false; 
QUnit.config.testTimeOut = 1000; 

asyncTest('Some test that needs companies.', function() { 
    function getCompanies() { 
     var companies = new Companies(); 
     ok(1); 
     start(); 
    } 
    setTimeout(getCompanies, 500); 
}); 

asyncTest('Some other async test that triggers a listener in companies.', function() { 
    var companies = new Companies(); 

    events.trigger("userSet:company", { name: "Acme", id: 1 }); 

    stop(); 
    events.on('fetched:departments', function(response) { 
     console.log(response); 
     deepEqual(response, [1, 2, 3]); 
     start(); 
    }); 
}); 

見我的答案在此的其他問題的更多細節: Test fails then succeeds

希望這可以幫助你!