NUnit Assert.AreEqual DateTime Tolerances

我想知道是否有人find了一个很好的解决scheme:

在我们的unit testing中, 我们通常使用Assert.AreEqual()来validation我们的结果。 一切都很好, 直到我们开始尝试在DateTime属性上使用它。

虽然时间非常相似,但是有时会以毫秒为单位,这会导致testing失败。 在我们的申请中; 只要他们准确到第二; 这对我们来说已经足够了。

在这种情况下,有没有人find一个很好的方法来实现公差? 通常我们的解决方法是将其分成两个单独的语句; 一个检查.ToShortDateString() ,另一个检查.ToShortTimeString() ,但在我看来这看起来马虎。

你可以用类似的方法来检查公差:

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

如果您不确定哪个date更新,请使用

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

使用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); 

要正确检查任意2个任意date是否等于1秒的容差,以下是正确的解决scheme:

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

我想我会添加这个作为一个解决scheme,因为接受的解决scheme是错误的,当date2大于date1超过一秒钟,并且解决scheme没有更新后,我的评论@ SwDevMan81。