为什么datetime不能比较?
我的C#unit testing有以下说法:
Assert.AreEqual(logoutTime, log.First().Timestamp);
以下信息为何失败:
Assert.AreEqual failed. Expected:<4/28/2010 2:30:37 PM>. Actual:<4/28/2010 2:30:37 PM>.
他们不一样吗?
更新:
如果你只关心第二个,请使用这个:
Assert.AreEqual(logoutTime.ToString(), log.First().Timestamp.ToString());
你有没有证实蜱/毫秒数是相等的?
如果你连续两次执行DateTime.Now()
,它们看起来是同一个数字,甚至到第二个 ,但是它们通常会因滴答而变化。 如果你只想检查一分钟的平等,只比较每个DateTime到那个程度。 有关舍入date时间的信息,请参阅此处
关于解决scheme的说明 :
Now属性经常用于衡量性能。 但由于其分辨率较低,不适合用作对标工具。 更好的select是使用秒表类。
Assert失败方法可能是在DateTime上调用ToString() ,该方法返回一个不含毫秒组件的截断的,人类可读的dateforms。 这就是为什么当DateTime对象的精度为100纳秒单位(称为Tick )时,它们看起来是相等的。 这意味着极不可能有两个DateTime对象具有完全相同的值。 为了比较你可能想要截断的价值,也许通过格式化date为您所需要的保真度。
你确定logoutTime和log.First()。Timestamp都被input为DateTime吗?
如果是这样,那么对于更具体的时间信息(例如,毫秒),它们也可能具有不同的值。
使用entity framework,如果使用.AsNoTracking()
从数据库中获取数据,则DateTime
属性将四舍五入,但如果原始值仍在内存中,则不一定会使用.AsNoTracking()
四舍五入。 因此,对于涉及数据库往返的集成testing,我想最好使用.ToString()
因为数据库会稍微降低精度。
尝试像Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks)
假设logoutTime和log.First().Timestamp都是DateTimetypes,你应该尝试使用它来代替:
Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks);
我想Assert.AreEqual<T>
使用Object.Equals()
来确定对象的平等,但不是值。
可能这个陈述是比较两个不同的对象 ,因此返回false。