单元测试DateTime.Now

E. *_*rbo 3 .net c# oop datetime unit-testing

假设有班级

class Task
{
   public DateTime StartedDate {get; private set;}

   public Task() 
   {
      StartedDate = DateTime.Now;
   }
}
Run Code Online (Sandbox Code Playgroud)

我想测试在创建任务后开始处理任务的条件.因此,如果任务是在1月21日创建的,那么StartedDate应始终是1月 21日.我不确定是否将一些时间提供程序传递给任务构造函数是一个好主意.

Mar*_*ich 8

我不确定是否将一些时间提供程序传递给任务构造函数是一个好主意.

这是个好主意.引用DateTime.Now被认为是对全局状态的依赖,不鼓励直接使用.关于构造函数 - 可能有人认为在构造函数中执行此操作也是一种不好的做法("在构造函数内部进行工作"),但这是一个不同的主题.

可测试性的最佳实践是创建一个小的包装器接口,以提供可以DateTime.Now针对测试实施或模拟的当前时间.

虽然像Microsoft Fakes这样的测试框架能够替换DateTime.Nowgetter,但设置和维护很复杂,只应在需要测试遗留代码时使用.

如果你碰巧已经在使用像System.Reactive("Rx.NET")或NodaTime 这样的库,那么随着时间的推移它们已经有了抽象(IScheduler对于rx,IClock在NodaTime中).