NUnit Assert.AreEqual DateTime 容差
Posted
技术标签:
【中文标题】NUnit Assert.AreEqual DateTime 容差【英文标题】:NUnit Assert.AreEqual DateTime Tolerances 【发布时间】:2011-04-04 10:04:33 【问题描述】:我想知道是否有人找到了解决此问题的好方法:
在我们的单元测试中;我们通常使用Assert.AreEqual()
来验证我们的结果。一切都很好;直到我们开始尝试在 DateTime 属性上使用它。
虽然时间非常相似,但有时它们会相差几毫秒,这会导致测试失败。在我们的应用程序中;只要它们精确到秒;这对我们来说已经足够了。
有没有人找到一种在这种情况下以某种方式实现公差的好方法?通常,我们的解决方法是将其拆分为 2 个单独的语句;一个检查.ToShortDateString()
,另一个检查.ToShortTimeString()
,但在我看来这看起来很草率。
【问题讨论】:
【参考方案1】:您可以通过以下方式检查公差:
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);
【讨论】:
非常好。从未想过以这种方式实现它 但你真的不是说<
吗?
@Dan Tao - 是的,我的断言思想是落后的,是的,如果你想让它出错,那么它应该
如果 date2 比 date1 大一秒以上,这将失败。应检查总秒差的绝对值。例如Debug.Assert(Math.Abs((date1 - date2).TotalSeconds) < 1)
NUnit 对此有内置支持,请参阅下面***.com/questions/3577856/…的答案@【参考方案2】:
使用 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);
【讨论】:
更清洁的解决方案。如果这个 Assert 失败,产生的消息会清楚地指出失败的原因。 为什么使用Assert.That
而不是Assert.AreEqual
?你能解释一下吗?【参考方案3】:
要正确检查任意 2 个日期是否等于 1 秒容差范围内,以下是正确的解决方案:
Debug.Assert(Math.Abs((date1 - date2).TotalSeconds) < 1)
我想我会将其添加为解决方案,因为当date2
大于date1
超过一秒时,接受的解决方案不正确,并且在我对@SwDevMan81 发表评论后,该解决方案尚未更新。
【讨论】:
以上是关于NUnit Assert.AreEqual DateTime 容差的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Assert.AreEqual(1.0, double.NaN, 1.0) 通过?
C# 我怎么能期待 Assert.AreEqual 中的异常?