单元测试基于时间的组件?

Sto*_*ver 5 c# datetime unit-testing

所以我正在编写一个缓存系统(不是太复杂,但它有非常好的语义)和ttl(生存时间)的项目.

当然ttl必须经过单元测试,但由于无法在C#中注入"IDateTime"或"ITimeSpan"的新实现(因为没有这样的东西),你会怎么做呢?

首先写一个新的组件"IDateTimeProvider"和"DateTimeProvider",然后哪个可以模拟?

是不是重新实现了.NET运行时库的一部分......难以理解?

编辑:谢谢大家的惊人答案!我现在知道我要做什么了!

PHe*_*erg 6

我通常使用Ayende解决方案的变.

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

    public static DateTime Now { get { return DateProvider(); } }
}
Run Code Online (Sandbox Code Playgroud)

在测试代​​码中,您现在可以使用SystemTime.Now来获取当前时间:

var currentTime = SystemTime.Now;
Run Code Online (Sandbox Code Playgroud)

在测试中,您可以将当前时间设置为已知值:

SystemTime.DateProvider = () => new DateTime(2010,6,25);
Run Code Online (Sandbox Code Playgroud)


nas*_*nas 4

您可能想看看这个问题:

如何最小起订量 System.IO.FileInfo 类...或任何其他没有接口的类?

简而言之,您要么需要自己创建一个包装类,要么使用已经为 DateTime 提供包装类的库,例如SystemWrapper