.NET 8からDateTimeに依存した処理のテストに役立つTimeProviderとFakeTimeProviderという仕組みが追加されたので試していきます。
実行環境
- VS2022 17.8.1
- .NET 8
準備
NuGetパッケージをインストールします。これでFakeTimeProviderが使えるようになります。 www.nuget.org
現在時刻をセットする
SetUtcNowでTimeProviderが任意の現在時刻を返すようにできます。
var timeProvider = new FakeTimeProvider(); timeProvider.SetUtcNow(new DateTimeOffset(new DateTime(2023, 11, 30))); Console.WriteLine(timeProvider.GetLocalNow());
2023/11/30 0:00:00 +09:00
GetUtcNowが返す型はDateTimeではなくDateTimeOffsetになっています。
TimeZoneをセットする
SetLocalTimeZoneで任意のタイムゾーンをセットすることができます。
var timeProvider = new FakeTimeProvider(); timeProvider.SetUtcNow(new DateTimeOffset(new DateTime(2023, 11, 30))); timeProvider.SetLocalTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time")); Console.WriteLine(timeProvider.GetLocalNow());
2023/11/29 14:00:00 -10:00
現在時刻を進める
Advanceで現在時刻を任意の時間分進めたり戻したりできます。
var timeProvider = new FakeTimeProvider(); timeProvider.SetUtcNow(new DateTimeOffset(new DateTime(2023, 11, 30))); Console.WriteLine(timeProvider.GetLocalNow()); timeProvider.Advance(TimeSpan.FromMinutes(3)); Console.WriteLine(timeProvider.GetLocalNow());
2023/11/30 0:00:00 +09:00 2023/11/30 0:03:00 +09:00
現在時刻を取得するたびに現在時刻を進める
AutoAdvanceAmountに任意のTimeSpanをセットすることで、GetLocalNowで時刻を取得するたびにセットしたTimeSpan分時刻が進むようになります。
var timeProvider = new FakeTimeProvider(); timeProvider.SetUtcNow(new DateTimeOffset(new DateTime(2023, 11, 30))); timeProvider.AutoAdvanceAmount = TimeSpan.FromSeconds(3); for (int i = 0; i < 10; i++) { Console.WriteLine(timeProvider.GetLocalNow()); }
2023/11/30 0:00:00 +09:00 2023/11/30 0:00:03 +09:00 2023/11/30 0:00:06 +09:00 2023/11/30 0:00:09 +09:00 2023/11/30 0:00:12 +09:00 2023/11/30 0:00:15 +09:00 2023/11/30 0:00:18 +09:00 2023/11/30 0:00:21 +09:00 2023/11/30 0:00:24 +09:00 2023/11/30 0:00:27 +09:00