Sto*_*ver 5 c# datetime unit-testing
所以我正在编写一个缓存系统(不是太复杂,但它有非常好的语义)和ttl(生存时间)的项目.
当然ttl必须经过单元测试,但由于无法在C#中注入"IDateTime"或"ITimeSpan"的新实现(因为没有这样的东西),你会怎么做呢?
首先写一个新的组件"IDateTimeProvider"和"DateTimeProvider",然后哪个可以模拟?
是不是重新实现了.NET运行时库的一部分......难以理解?
编辑:谢谢大家的惊人答案!我现在知道我要做什么了!
我通常使用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)
您可能想看看这个问题:
如何最小起订量 System.IO.FileInfo 类...或任何其他没有接口的类?
简而言之,您要么需要自己创建一个包装类,要么使用已经为 DateTime 提供包装类的库,例如SystemWrapper。