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

【讨论】:

非常好。从未想过以这种方式实现它 但你真的不是说&lt;吗? @Dan Tao - 是的,我的断言思想是落后的,是的,如果你想让它出错,那么它应该 如果 date2 比 date1 大一秒以上,这将失败。应检查总秒差的绝对值。例如Debug.Assert(Math.Abs((date1 - date2).TotalSeconds) &lt; 1) NUnit 对此有内置支持,请参阅下面***.com/questions/3577856/…的答案@【参考方案2】:

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

【讨论】:

更清洁的解决方案。如果这个 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 不起作用

C# 我怎么能期待 Assert.AreEqual 中的异常?

如何用 FluentAssertions 替换 Assert.Fail()

四则运算-词频统计

使用C#为MSTest测试项目实现自定义断言