2010-06-04 154 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对象,该对象从硬件时钟或模拟时钟读取刻度。

就你而言,你可以为你的单元测试提供一个可控的计时器,并且可以在生产模式下提供一个代表系统时间的计时器。这样,您就可以控制测试用例所经过的时间,从而控制测试类在某些超时条件下如何反应。

伪代码: