代码之家  ›  专栏  ›  技术社区  ›  sourcenouveau

带超时的单元测试

  •  7
  • sourcenouveau  · 技术社区  · 14 年前

    我很容易对通信组件进行存根和模拟,以便触发我要测试的值。问题是,如果我在一台繁忙的机器上运行单元测试(如构建机器),并且有足够大的延迟导致属性默认,那么单元测试将失败。

    在模拟各种通信条件时,如何测试以确保此属性具有正确的值?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Péter Török    14 年前

    您可以将timeout属性设置为可配置的,然后在单元测试中将其设置为足够高的值(如果您希望单元测试重置行为,则设置为足够低的值)。

        2
  •  10
  •   mhaller    14 年前

    Timer 对象,它从硬件时钟或模拟时钟中读取滴答声。

    在您的例子中,您可以为单元测试提供一个可控的计时器,以及一个在生产模式下委托给系统时间的计时器。这样,就可以控制测试用例经过的时间,从而控制被测类在特定超时条件下的反应。

    伪代码:

    public void testTimeout() throws Exception {
      MockTimerClock clock = new MockTimerClock();
    
      ClassUnderTest cut = new ClassUnderTest();
      cut.setTimerClock(clock);
      cut.beginWaitingForCommunication();
    
      assertTrue(cut.hasDefaultValues());
      cut.receiveOtherValues();
      assertFalse(cut.hasDefaultValues());
    
      clock.tick(5,TimeUnit.SECONDS);
      assertTrue(cut.hasDefaultValues());
      cut.shutdown();
    }
    
        3
  •  3
  •   g t Omri Btian    6 年前

    使用时也有类似的问题 DateTime.Now Ayende described a trick 为了处理我喜欢的事情:

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

    也许你可以用同样的技巧来暂停?