gpt4 book ai didi

c# - 难以比较两个 DateTime 实例

转载 作者:行者123 更新时间:2023-11-30 13:32:46 25 4
gpt4 key购买 nike

我正在用 C# (.NET 4.5) 编写单元测试类。在其中一个测试中,我在构建类 FeedbackDao 的实例后检查各种属性的值。在构造时,FeedbackDaoFeedbackDate 属性设置为 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?而且,如果我不相信这种比较,我该如何编写严格的测试来检查构造 FeedbackDaoFeedbackDate 的值?

最佳答案

My assumption is that feedbackDao.FeebackDate should always be just a little earlier than the current time returned by DateTime.Now, even if it's only by a millisecond.

是什么让你这么想的?这表明 1000 次调用必须至少 1 秒,这似乎不太可能。

此外,DateTime.Now 只有大约 10-15 毫秒 IIRC 的实际粒度,如果调用 DateTime.Now,经常 快速连续两次,您将两次获得相同的值。

出于可测试性和清晰表达依赖性的目的,我喜欢使用“时钟”接口(interface) (IClock),它始终用于提取当前系统时间。然后,您可以编写一个假的实现来控制您认为合适的时间。

此外,这个断言是有缺陷的:

Assert.IsTrue(feedbackDao.FeebackDate.CompareTo(DateTime.Now) < 0,
feedbackDao.FeebackDate.CompareTo(DateTime.Now).ToString());

它有缺陷,因为它对 DateTime.Now 求值两次...所以它报告的值不一定与它检查的值相同。最好是:

DateTime now = DateTime.Now;
Assert.IsTrue(feedbackDao.FeebackDate.CompareTo(now) < 0,
feedbackDao.FeebackDate.CompareTo(now).ToString());

或者更好:

DateTime now = DateTime.Now;
DateTime feedbackDate = feedbackDao.FeebackDate;
Assert.IsTrue(now < feedbackDate,
feedbackDate + " should be earlier than " + now);

关于c# - 难以比较两个 DateTime 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11882745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com