2010-08-26 71 views
44

我想知道是否有人發現了一個很好的解決方案:NUnit Assert.AreEqual DateTime Tolerances

在我們的單元測試中,我們通常使用Assert.AreEqual()來驗證我們的結果。一切都很好,直到我們開始嘗試在DateTime屬性上使用它。

儘管時間非常相似,但有時它們以毫秒爲單位,這會導致測試失敗。在我們的申請中;只要他們準確到第二個;這對我們來說已經足夠了。

有沒有人發現一種很好的方法來實現公差在這種情況下?通常我們的解決方法是將其分成2個單獨的語句;其中一個檢查.ToShortDateString(),另一個檢查.ToShortTimeString(),但在我看來這看起來馬虎。

回答

66

您可以檢查公差的東西,如:

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); 
+0

非常好。從來沒有想過以這種方式實現它 – 2010-08-26 17:51:18

+0

但是,你真的不是指'<? – 2010-08-26 17:51:50

+0

@丹濤 - 是的,我的斷言思想是落後的,是的,如果你想要它錯誤,那麼它應該< – SwDevMan81 2010-08-26 17:56:12

9

要正確檢查任意2個任意日期是否等於在1秒的容差之內,下面是一個正確的解決方案:

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

我想我會超過第二添加爲解決方案,因爲接受的解決方案是不正確時date2大於date1大,並且解決方案沒有在我對@ SwDevMan81的評論中更新。

73

使用Assert.ThatIs.Equal約束,而不是Assert.AreEqual。以下是來自Nunit網站的代碼示例:

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); 
+0

優秀的答案!謝謝! – jrista 2012-02-09 21:34:01

+0

更清潔的解決方案。如果此斷言失敗,則生成的消息將清楚地指示失敗的原因。 – GuiSim 2012-04-20 17:32:58

+1

恕我直言,遠遠好於接受的答案! – AFract 2013-01-31 14:10:41