ひでぼ~blog

C#ときどきゲーム

FakeTimeProviderを試す

.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

参考

devblogs.microsoft.com