単体テスト: DateTime.Now を分離
単体テストを行う場合、システムのクロックを変更せずに現在時刻を制御する必要があることがよくあります。これにより、コードが DateTime.Now に依存する場合に問題が発生します。
最良のアプローチは、DateTime.Now の周囲に抽象化レイヤーを作成することです。この抽象化をテスト対象のコードに挿入すると、単体テスト中に現在時刻をシミュレートできるようになります。
代替案: 環境コンテキスト
<code class="language-csharp">public abstract class TimeProvider { private static TimeProvider current = DefaultTimeProvider.Instance; public static TimeProvider Current { get { return TimeProvider.current; } set { if (value == null) { throw new ArgumentNullException("value"); } TimeProvider.current = value; } } public abstract DateTime UtcNow { get; } public static void ResetToDefault() { TimeProvider.current = DefaultTimeProvider.Instance; } }</code>
使用方法:
<code class="language-csharp">var now = TimeProvider.Current.UtcNow;</code>
単体テストの場合:
<code class="language-csharp">var timeMock = new Mock<TimeProvider>(); timeMock.SetupGet(tp => tp.UtcNow).Returns(new DateTime(2010, 3, 11)); TimeProvider.Current = timeMock.Object;</code>
ただし、後続のテストへの干渉を避けるために、TimeProvider.ResetToDefault() を呼び出してテスト フィクスチャを必ずクリーンアップしてください。
以上が効果的な単体テストのために「DateTime.Now」を分離するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。