単体テスト: モックでの DateTime.Now の克服
単体テストは特定のタイムスタンプに依存することがよくありますが、システム時刻の変更は理想的ではない可能性があります。この記事では、DateTime.Now をモックするための効果的な戦略について説明します。
抽象化と注入
推奨されるアプローチは、現在の時刻を抽象化 (TimeProvider など) にカプセル化し、それをコンシューマーに注入することです。これにより、元の実装を運用環境で保持しながら、テスト中にモック化された TimeProvider を置き換えることができます。
環境コンテキスト
あるいは、時間の抽象化を環境コンテキストとして定義することもできます。これにより、システム時間を直接変更せずに現在の時間を変更できます。以下は環境コンテキスト実装の例です:
<code>public abstract class TimeProvider { private static TimeProvider current = DefaultTimeProvider.Instance; public static TimeProvider Current { get { return current; } set { current = value; } } public abstract DateTime UtcNow { get; } }</code>
このコンテキストでは、TimeProvider.Current は現在の時刻を表します。テストで使用するには、TimeProvider.Current をモック オブジェクトに置き換えます:
<code>using Moq; var timeMock = new Mock<TimeProvider>(); timeMock.SetupGet(tp => tp.UtcNow).Returns(new DateTime(2010, 3, 11)); TimeProvider.Current = timeMock.Object;</code>
これにより、実稼働コードに影響を与えることなく、単体テストで特定のタイムスタンプを設定できるようになります。ただし、各テストの後に、忘れずに時間プロバイダーをデフォルトの状態にリセットすることが重要です。
以上が単体テストで DateTime.Now を効果的にモックするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。