1

DateTime をシミュレートしたい。実行するアクションのリストがあり、各アクションに日時フィールドがあるとしましょう。その日時が来たら、アクションを実行する必要があります。DateTime.Now; で日時を確認できます。しかし、どうすれば DateTime をシミュレートできますか。つまり、現在の時刻が午後 2 時である場合。そして、アクションは午後 4 時、午後 5 時に実行する必要があります。現在時刻を午後 4 時までシミュレートすると、最初のアクションが実行され、1 時間後に 2 番目のアクションが実行されますか?

ありがとう、

4

4 に答える 4

2

少し前に、日付をそのようにテストする方法について投稿しました。

http://ivowiblo.wordpress.com/2010/02/01/how-to-test-datetime-now/

それが役に立てば幸い

于 2012-05-09T03:37:00.607 に答える
1

これは実際には複雑な問題ですが、幸運にも解決策があります: Noda Timeです。

于 2012-05-09T03:31:15.000 に答える
1

これを実現する最も簡単な方法は、システム クロックを「テスト時間」に変更し、テストを実行してから元に戻すことです。それはかなりハックで、あまりお勧めしませんが、うまくいきます。

より良い方法はDateTime.Now、静的な値を注入するか、テストのために取得した値を操作できるようにする抽象化を使用することです。テスト値を静的なスナップショットのままにするのではなく、「ティック」したい場合は、TimeSpan「現在」に を追加するのが最も簡単です。

したがって、「オフセット」と呼ばれるアプリケーション設定を追加して、TimeSpan

<appSettings>
    <add key="offset" value="00:00:00" />
</appSettings>

そして、DateTime.Now取得するたびにこの値を追加します。

public DateTime Time
{ 
    get 
    { 
        var offset = TimeSpan.Parse(ConfigurationManager.AppSettings["offset"]);
        return DateTime.Now + offset;
    }
}

offsetこれを 1 時間 20 分後に実行するには、値を調整するだけです

<add key="offset" value="01:20:00" />

理想的には、インターフェイスを作成してDateTime依存性注入を実装しますが、その目的のためには (それが望ましいですが)、これによって開くワームの缶が混乱の世界を生み出すことをお勧めします。これは簡単で、うまくいきます。

于 2012-05-09T04:17:06.773 に答える
1

最も簡単な方法は、DateTime.Now をチェックする部分をコメント アウトし、スクリプト化された時間のセットを返す呼び出し可能な新しいメソッド/プロパティを作成することです。

例えば:

class FakeDateTime
{
    private static int currentIndex = -1;
    private static DateTime[] testDateTimes = new DateTime[]
        {
            new DateTime(2012,5,8,8,50,10),
            new DateTime(2012,5,8,8,50,10)  //List out the times you want to test here
        };

    /// <summary>
    /// The property to access to check the time.  This would replace DateTime.Now.
    /// </summary>
    public DateTime Now
    {
        get
        {
            currentIndex = (currentIndex + 1) % testDateTimes.Length;
            return testDateTimes[currentIndex];
        }
    }

    /// <summary>
    /// Use this if you want to specifiy the time.
    /// </summary>
    /// <param name="timeIndex">The index in <see cref="testDateTimes"/> you want to return.</param>
    /// <returns></returns>
    public DateTime GetNow(int timeIndex)
    {
        return testDateTimes[timeIndex % testDateTimes.Length];
    }
}

より具体的な (またはより良い) 回答が必要な場合は、いくつかのコード サンプルを提供してください。

于 2012-05-09T03:55:16.163 に答える