如何测试时间依赖的方法?

时间:2012-05-15 19:54:40

标签: testing time

测试时间相关方法的标准/推荐方法是什么?

举个例子:

我有一个类Foo,其方法GetTimestamp()GetTimestamp()应该返回string中的给定时间,该时间总是按字典顺序增加(按字母顺序排序)。< / p>

没有过度工程用于测试目的,测试这个的最佳方法是什么?

我最初的想法是创建一个类构造函数,它接受IDateTimeProvider,它的唯一属性是DateTime属性,然后从单元测试我可以创建一个虚拟的DateTimeProvider ...

这是一个简单的案例,但代表了我所想知道的。

这有很多其他应用程序,例如测试闰年的日期相关逻辑等。

2 个答案:

答案 0 :(得分:1)

我喜欢做的是创建一个公共函数,该函数在需要当前日期/时间的类中返回DateTime(Func<DateTime>),并将其设置为默认返回DateTime.Now。然后,在测试期间,我注入了一个测试函数,它返回我想要测试的DateTime。

public class MyClass
{
    public Func<DateTime> DateTimeNow = () => DateTime.Now;

    public void MyMethod()
    {
        var currentTime = DateTimeNow();
        //... do work
    }
}

public class MyClassTest
{
    public void TesttMyMethod()
    {
        // Arrange
        var myClass = new MyClass();
        myClass.DateTimeNow = () => new DateTime(1999, 12, 31, 23, 59, 59);

        // Act
        myClass.MyMethod();

        // Assert
        // my asserts
    }
}

答案 1 :(得分:0)

这是一个很好的资源:

Why there is no IDateTimeProvider in .NET and DateTime has Now getter?

听起来这是一个不错的方法。