C# NUnit Assert.AreEqual日期时间公差

C# NUnit Assert.AreEqual日期时间公差,c#,.net-3.5,nunit,C#,.net 3.5,Nunit,我想知道是否有人找到了解决这个问题的好办法: 在我们的单元测试中;我们通常使用Assert.AreEqual()来验证我们的结果。一切都很好;直到我们开始尝试在DateTime属性上使用它 虽然时间非常相似,但有时它们会以毫秒为单位关闭,这会导致测试失败。在我们的应用中;只要它们精确到秒;这对我们来说已经足够了 在这种情况下,有没有人找到一个好方法来实现公差?通常我们的解决方法是将其拆分为两个单独的语句;一个检查.ToShortDateString(),另一个检查.ToShortTimeStri

我想知道是否有人找到了解决这个问题的好办法:

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

虽然时间非常相似,但有时它们会以毫秒为单位关闭,这会导致测试失败。在我们的应用中;只要它们精确到秒;这对我们来说已经足够了


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

您可以使用以下方法检查公差:

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

要正确检查任意两个日期是否等于1秒公差范围内,以下是正确的解决方案:

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

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

使用Assert.That是.Equal约束,而不是Assert.arequal。下面是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);

很不错的。从来没有想过用这种方式实现它,但你真的是指Dan Tao吗?是的,如果我的断言思想是反向的,是的,如果你想让它出错,那么如果date2比date1大一秒以上,它就会失败。应检查总秒数差的绝对值。e、 g.
Debug.Assert(Math.Abs((date1-date2.TotalSeconds)<1)
NUnit对此有内置的支持,请参见下面我的答案更简洁的解决方案。如果此断言失败,生成的消息将清楚地指出失败的原因。为什么使用
Assert.That
而不是
Assert.AreEqual
?你能解释一下吗?@kuskmen查看
Assert上的讨论。如果操作正确,
将为你提供更多的可扩展性和更好的日志记录。
Debug.Assert(Math.Abs((date1 - date2).TotalSeconds) < 1)
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);