単体テストでの時間依存性の分離
DateTime.Now
に依存するコードのテストには、独特の課題が伴います。 システム クロックに対して直接テストすると不安定になり、テストの信頼性が低くなります。 この依存関係を管理するための 2 つの効果的なアプローチを次に示します。
アプローチ 1: 依存性の注入
推奨される方法は、時間依存性を抽象化することです。 現在時刻を取得するメソッドを定義するインターフェース (例: ITimeProvider
) を作成します。 このインターフェースは、SystemTimeProvider
を使用する具象クラス (例: DateTime.Now
) で実装します。現在時刻を必要とするクラスにこのインターフェイスを挿入します。
単体テスト中に、事前に決定された ITimeProvider
値を返すモック DateTime
を挿入できます。これにより、システム クロックに影響を与えることなく、テストに使用される時間を完全に制御できます。
アプローチ 2: アンビエント コンテキスト (注意)
もう 1 つのオプションには、静的コンテキストの使用が含まれます。アクティブな時間プロバイダーを保持する静的な TimeProvider
プロパティを持つ基本クラス (例: Current
) を作成します。 デフォルトの実装 (例: SystemTimeProvider
) を最初に設定できます。
テストの場合、静的 Current
プロパティをオーバーライドしてモック プロバイダーを使用します。 重要なこと、後続のテストで予期しない動作が発生しないように、各テストの後に Current
プロパティをデフォルトにリセットすることを忘れないでください。このアプローチでは、テストの干渉を避けるために細心の注意を払ってクリーンアップする必要があります。
概要
どちらの方法でも、単体テストの時間依存性を効果的に分離できます。 ただし、依存関係の注入は、静的なアンビエント コンテキストを使用する場合と比較して、デザインがすっきりし、意図しない副作用のリスクが軽減されるため、一般に好まれます。
以上が「DateTime.Now」に依存するコードを効果的に単体テストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。