5

現在の日時に基づいてデータベースからライブ時系列データを呼び出すWindowsサービスをC#で構築しました。
テストDatabseにテストデータがあり、データが正しい方法で使用されているかどうかを計算するために使用したいと思います。
誰かがアプリケーションを使用したことがあるか、またはローカルコンピュータでシステム日付を「モック」する他の方法があるかどうか疑問に思いました。したがって、たとえば、このアプリケーションを実行して、システムの日付を指定された日付に設定するように設定できます。

どんなアドバイスも素晴らしいでしょう。

4

3 に答える 3

12

DateTime.Nowインターフェイスの背後にあるプロパティへのアクセスをカプセル化するだけです。

public interface IDateTimeProvider
{
    DateTime Now { get; }
}

コードでは、次のような実装を使用します。

public class DateTimeProvider : IDateTimeProvider
{
    public DateTime Now { get { return DateTime.Now; } }
}

IDateTimeProviderまた、テストの場合は、テスト クラスを作成するか、モック フレームワークを使用してモックするだけです。

このインターフェイスを依存性注入などの手法で使用すると、実行時であってもサービスの動作を簡単に変更できます。

IDateTimeProviderたとえば、常に数時間オフの を作成できます。

public class AlwaysToLateDateTimeProvider : IDateTimeProvider
{
    public DateTime Now { get { return DateTime.Now.AddHours(-2); } }
}

または、ファイル、データベース、パイプなどから「モック」日時を読み取る実装を作成します。

テスト中は、これらの実装のいずれかを使用するようにサービスを構成し、ライブ モードで実行している間は、「正しい」日時を返す通常の実装を使用するように依存性注入を構成します。


もちろんTypeMock Isolatorもあります...

Isolate.WhenCalled(() => DateTime.Now).WillReturn(new DateTime(2008, 1, 1));
于 2012-06-19T11:30:21.000 に答える
4

たとえば、テストを実行するときに、これを使用してオーバーライドできるようになりました。DateTime.Nowを使用する実際の実装では、代わりに新しいSystemTime.Nowを使用します。テストでは、選択した値を返す別の関数にNowを設定するだけです。

public static class SystemTime
{
    private static Func<DateTime> now = () => DateTime.Now;

    public static Func<DateTime> Now
    {
        get { return now; }
        set { now = value; }
    }
}

テストでの使用例:

SystemTime.Now = () => DateTime.Now.AddMinutes(20);

単体テストの分解では、それを元に戻すことが重要です。SystemTime.Now = () => DateTime.Now

通常の使用法:

DateTime now = SystemTime.Now();
于 2012-06-19T10:56:20.820 に答える