是否有 nuget 包或其他“标准”包装了您的代码耦合到时创建的硬依赖项DateTime.Now
?
在写我自己的之前,我正在寻求这方面的指导。尽管这样做是微不足道的,但如果它已经作为某种标准,我宁愿使用现有的东西。
是否有 nuget 包或其他“标准”包装了您的代码耦合到时创建的硬依赖项DateTime.Now
?
在写我自己的之前,我正在寻求这方面的指导。尽管这样做是微不足道的,但如果它已经作为某种标准,我宁愿使用现有的东西。
我非常怀疑是否有任何如此微不足道的东西的 nuget 包 - 一个接口和可能两个实现(“系统”时钟和一个用于测试的假时钟)。
如果你自己做这些,我会强烈考虑让时钟返回 aDateTimeOffset
而不是 a DateTime
,或者至少让它 wrap DateTime.UtcNow
...DateTime.Now
是一个等待发生的问题......
然而,野田时间开箱即用地包含了所有这些。你可能不想要整个野田时间只是因为这个原因,请注意......
(有一个 Noda Time nuget 包,但它肯定是预发布的。我需要在某个时候将它更新到 0.2 版本,但它仍然不是 v1 级别。虽然到达那里......)
如果你想要一种真正廉价和愉快的方式来表达依赖关系,你总是可以使用一个Func<DateTime>
或Func<DateTimeOffset>
任何你通常表达依赖关系的地方。接口方法虽然更干净:)
我不知道有任何 nuget 包可以做到这一点。当我遇到这个问题时,我只是创建了自己的类型,如下所示:
public static class SystemTime
{
public static Func<DateTime> Now = () => DateTime.Now;
}
这样,在您的单元测试中,您可以轻松更改 Now 的功能以返回您想要的任何 DateTime。
假设我们有一个方法:
public void Foo() {
var now = DateTime.UtcNow;
Record(now);
我总是在需要时采用的解决方案DateTime.Now
是:
public void Foo(DateTime? now = null) {
Record(now.GetValueOrDefault(DateTime.UtcNow));