是否有可能在单元测试中模拟出时间?

mez*_*oid 4 time unit-testing mocking

这个问题之后......我正在尝试对以下场景进行单元测试:

我有一个类允许一个方法调用一个方法来执行某些操作,如果它失败等待一秒钟并重新调用该方法.

假设我想调用方法DoSomething()...但是如果DoSomething()抛出异常,我希望能够重试最多调用它3次,但每次尝试之间等待1秒.在这种情况下,单元测试的目的是验证当我们调用DoSomething()3次,每次重试之间等待1秒钟时,总时间> = 3秒.

不幸的是,我能想到测试它的唯一方法是使用秒表来计时....它有两个副作用......

  1. 执行测试需要3秒......我通常喜欢我的测试以毫秒运行
  2. 运行测试的时间长度变化+/- 10ms左右,这可能导致测试失败,除非我考虑到这种差异.

如果有一种方法可以模拟出这种依赖性,那么我的测试能够更快地运行并且在结果中相当一致,那会更好.不幸的是,我想不出办法这么做......所以我想我会问,看看你们中间是否有人遇到过这个问题......

Mat*_*ley 8

您可以创建一个Waiter提供方法的类,该方法Wait(int)等待指定的时间量.对此方法进行测试,然后在单元测试中传入一个模拟版本,该版本只是跟踪要求等待的时间,但会立即返回.

例如(C#):

interface IWaiter
{
    void Wait(int milliseconds);
}

class Waiter : IWaiter
{
    public void Wait(int milliseconds)
    {
        // not accurate, but for the sake of simplicity:
        Thread.Sleep(milliseconds);
    }
}

class MockedWaiter : IWaiter
{
    public void Wait(int milliseconds)
    {
        WaitedTime += milliseconds;
    }
    public int WaitedTime { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)