ホームページ >バックエンド開発 >C++ >単体テストで DateTime.Now を効果的にモックするにはどうすればよいですか?

単体テストで DateTime.Now を効果的にモックするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-12 09:50:43931ブラウズ

How Can I Effectively Mock DateTime.Now in Unit Tests?

単体テスト: モックでの 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。