用途:指导在 .NET 中测试依赖日期时间的逻辑,避免直接使用 DateTime.Now/UtcNow 导致测试不可控。
主要能力:以 TimeProvider 抽象时间来源,通过依赖注入传入;生产环境注册 TimeProvider.System,测试使用 FakeTimeProvider。FakeTimeProvider 支持 SetUtcNow、SetLocalTimeZone、Advance、GetUtcNow、GetLocalNow,可冻结时间、快转时间、设定时区,用于测试缓存过期、Token 失效、营业时间、交易时段、排程触发等场景。
使用方式:服务类通过构造函数接收 TimeProvider,用 _timeProvider.GetLocalNow() 或 GetUtcNow() 取时间;测试中每个测试方法建立独立 FakeTimeProvider,用 SetLocalNow 扩展方法设定本地时间,用 Advance(TimeSpan) 非阻塞跳转时间。可结合 AutoFixture,通过 FakeTimeProviderCustomization 与 [Frozen(Matching.DirectBaseType)] 将 FakeTimeProvider 注入需要 TimeProvider 的构造函数。
限制与注意:需引用 Microsoft.Bcl.TimeProvider 与 Microsoft.Extensions.TimeProvider.Testing 套件;避免多个测试共用静态 FakeTimeProvider 实例;时区测试需明确设定时区。具体版本与安装命令资料未提供。