【发布时间】:2012-08-09 11:48:29
【问题描述】:
我正在用 C# (.NET 4.5) 编写单元测试类。在其中一个测试中,我在构造我们的类FeedbackDao 的实例后检查各种属性的值。在构造时,FeedbackDao 的 FeedbackDate 属性设置为 DateTime.Now。
FeedbackDao feedbackDao = new FeedbackDao();
// a couple of lines go here then I set up this test:
Assert.IsTrue(feedbackDao.FeedbackDate.CompareTo(DateTime.Now) < 0);
我的假设是 feedbackDao.FeedbackDate 应该总是比DateTime.Now 返回的当前时间早一点,即使它只是一毫秒,我的IsTrue 测试应该总是通过,但有时它会通过并且有时它会失败。当我添加这样的消息时:
Assert.IsTrue(feedbackDao.FeedbackDate.CompareTo(DateTime.Now) < 0,
feedbackDao.FeedbackDate.CompareTo(DateTime.Now).ToString());
消息有时显示为 -1(意味着 FeedbackDate 早于 Now),有时显示为 0(意味着 DateTime 实例相等)。
为什么FeedbackDate 不总是早于Now?而且,如果我不能相信这个比较,我怎么能写一个严格的测试来检查 FeedbackDate 在构造 FeedbackDao 时的值?
【问题讨论】:
-
为什么在地球不只是检查
feedbackDao.FeedbackDate > DateTime.Now或其他什么? -
如果我自己能想到这个问题,我为什么要问这个问题。这就是 Stackoverflow 出现的原因,不是吗?
-
@Paddy 谢谢。这回答了关于让我满意的严格测试的问题。我已经运行了好几次,它总是通过,让我确信属性设置正确。
-
请注意,另一个测试,您可以在其中允许日期相等。 Jon Skeet 的回答还指出了您的测试设计中的一个重大缺陷,您一定要检查一下。
-
<或<=的测试根本不应该给你任何信心。如果没有人初始化该字段,其默认值将是DateTime.MinValue,它始终通过测试。在仍然使用DateTime.Now对其进行初始化时,请参阅我的答案。
标签: c# .net unit-testing