NUnit Assert.AreEqual DateTime Tolerances

时间:2010-08-26 17:42:40

标签: c# .net-3.5 nunit

我想知道是否有人找到了一个很好的解决方案:

在我们的单元测试中;我们通常使用Assert.AreEqual()来验证我们的结果。一切都很好;直到我们开始尝试在DateTime属性上使用它。

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

在这种情况下,是否有人找到了以某种方式实施容差的好方法?通常我们的解决方法是将其拆分为两个单独的语句;一个检查.ToShortDateString(),另一个检查.ToShortTimeString(),但在我看来这看起来很草率。

3 个答案:

答案 0 :(得分:82)

使用 Assert.That Is.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);

答案 1 :(得分:78)

您可以使用以下内容检查公差:

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

答案 2 :(得分:10)

要正确检查任何2个任意日期是否等于1秒容差,以下是正确的解决方案:

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

我想我会将此作为解决方案添加,因为当date2大于date1超过一秒时,已接受的解决方案不正确,并且在我的评论之后解决方案尚未更新@ SwDevMan81。