2010-06-04 152 views
5

我是一個單元測試一個屬性的值經常變化,取決於它從另一個組件接收到的通信。如果該類在5秒內未收到任何通信,則該屬性將恢復爲默認值。單元測試超時

我很容易對存儲通信組件進行存根和模擬,以便觸發我想測試的值。問題是,如果我在繁忙的計算機上運行我的單元測試(如構建機器),並且有足夠長的延遲導致屬性默認,那麼我的單元測試將失敗。

在模擬各種通信條件時,如何測試以確保此屬性具有適當的值?

一個想法是重構我的代碼,以便我可以存根控制超時的類的一部分。另一種方法是編寫我的單元測試,以便它可以檢測是否由於超時而失敗並在測試結果中指出它。

回答

3

您可以使超時屬性可配置,然後在單元測試中將其設置爲足夠高的值(或足夠低,如果要單元測試重置行爲)。

+0

我選擇走這條路,因爲這是我的情況最簡單的解決方案。其他建議也很棒。謝謝大家! – 2010-06-04 17:19:33

3

使用DateTime.Now時存在相同的comon問題。 Ayende described一招對付它,我喜歡:

public static class SystemTime 
{ 
    public static Func<DateTime> Now =() => DateTime.Now; 
} 

,然後在您的測試:

[Test] 
public void Should_calculate_length_of_stay_from_today_when_still_occupied() 
{ 
    var startDate = new DateTime(2008, 10, 1); 
    SystemTime.Now =() => new DateTime(2008, 10, 5); 

    var occupation = new Occupation {StartDate = startDate}; 

    occupation.LengthOfStay().ShouldEqual(4); 
} 

也許你可以利用你的超時同親屬把戲?

+0

+1有趣。 – 2010-06-04 16:52:30

7

我會嘗試一種不同的方法。遊戲開發者通常需要一種方法來控制遊戲時間,例如用於快進功能或同步幀速率。它們引入一個Timer對象,該對象從硬件時鐘或模擬時鐘讀取刻度。

就你而言,你可以爲你的單元測試提供一個可控的計時器,並且可以在生產模式下提供一個代表系統時間的計時器。這樣,您就可以控制測試用例所經過的時間,從而控制測試類在某些超時條件下如何反應。

僞代碼: