单元测试 DateTime.Now.



>假设有类

class Task
{
   public DateTime StartedDate {get; private set;}
   public Task() 
   {
      StartedDate = DateTime.Now;
   }
}

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

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

这是个好主意。对DateTime.Now的引用被视为对全局状态的依赖关系,不建议直接使用。关于构造函数 - 可能会有人争辩说,在构造函数中这样做也是一种不好的做法("在构造函数中做工作"(,但这是一个不同的主题。

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

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

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

最新更新