web-dev-qa-db-ja.com

NUnit Assert.AreEqual DateTime Tolerances

誰かがこれに対する良い解決策を見つけたのかどうか疑問に思っています:

私たちのユニットテストでは、通常、Assert.AreEqual()を使用して結果を検証します。すべてが順調です。これをDateTimeプロパティで使用しようとするまで。

時間は非常に似ていますが、時々ミリ秒ずれているため、テストが失敗します。私たちのアプリケーションでは、彼らが秒に正確である限り;それで十分です。

誰かがこの場合に公差をどうにかして実装する良い方法を見つけましたか?通常、私たちの回避策はそれを2つの個別のステートメントに分割することです。 1つは.ToShortDateString()をチェックし、もう1つは.ToShortTimeString()をチェックしますが、これは私の考えではずさんに見えます。

60
Jim B

次のような方法で許容値を確認できます。

Debug.Assert((date1 - date2) < TimeSpan.FromSeconds(1));

どちらの日付が新しいかわからない場合は、

Debug.Assert(Math.Abs((date1 - date2).TotalSeconds) < 1)

NUnitは Within キーワードを使用して、これに対する組み込みサポートも追加しました

DateTime now = DateTime.Now;
DateTime later = now + TimeSpan.FromHours(1.0);

Assert.That(later, Is.EqualTo(now).Within(TimeSpan.FromHours(3.0)));
Assert.That(later, Is.EqualTo(now).Within(3).Hours);
81
SwDevMan81

Assert.AreEqualの代わりにAssert.ThatおよびIs.Equal制約を使用します。以下は、Nunit Webサイト自体のコードサンプルです。

DateTime now = DateTime.Now;
DateTime later = now + TimeSpan.FromHours(1.0);

Assert.That(now, Is.EqualTo(now) );
Assert.That(later, Is.EqualTo(now).Within(TimeSpan.FromHours(3.0)));
Assert.That(later, Is.EqualTo(now).Within(3).Hours);
82
Rajeesh

任意の2つの日付が1秒の許容範囲内であるかどうかを正しく確認するには、以下が正しい解決策です。

Debug.Assert(Math.Abs((date1 - date2).TotalSeconds) < 1)

date2date1より1秒以上大きい場合、承認されたソリューションが正しくなく、@ SwDevMan81へのコメントに従ってソリューションが更新されていないため、これをソリューションとして追加すると考えました。

10
Nathan Ernst