ホームページ > バックエンド開発 > C++ > 効果的な単体テストのために「DateTime.Now」を分離するには?

効果的な単体テストのために「DateTime.Now」を分離するには?

Patricia Arquette
リリース: 2025-01-12 08:10:42
オリジナル
911 人が閲覧しました

How to Isolate `DateTime.Now` for Effective Unit Testing?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート