假设有类
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/