c# - 单元测试 DateTime.Now

标签 c# .net unit-testing oop datetime

假设有类

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

   public Task() 
   {
      StartedDate = DateTime.Now;
   }
}

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

最佳答案

I'm not sure if passing some time provider to task constructor is a good idea.

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

可测试性的最佳实践是创建一个小型包装器接口(interface)来提供当前时间,该接口(interface)可以根据 DateTime.Now 实现或模拟以进行测试。

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

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

关于c# - 单元测试 DateTime.Now,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48364973/

相关文章:

c# - WPF 中的 MVVM - 如何提醒 ViewModel 模型中的变化......或者我应该吗?

c# - 不存在的数据库连接成功

visual-studio-2010 - VS2010 单元测试 “Pending” 无法完成测试

visual-studio - VS 2008,分析多个测试

c# - 使用 Linq 加载数据表 - 将 C# 转换为 VB.Net

c# - 开发 Multi-Tenancy asp.net MVC 应用程序时要记住什么?

c# - .Net Framework 3.5 反射问题

c# - 结果 : 0x80040154 (REGDB_E_CLASSNOTREG))

silverlight - 使用MVVM/CSLA在Silverlight中进行XAML单元测试

c# - Google 中的 URL 索引