为什么datetime无法比较?

时间:2010-04-28 18:35:31

标签: c# unit-testing datetime-comparison

我的C#单元测试有以下声明:

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

8 个答案:

答案 0 :(得分:42)

您是否确认滴答/毫秒数相等?

如果你两次背靠背DateTime.Now(),它们看起来是同一个数字,直到分钟,甚至可能是第二,但它们通常会有不同的数字。 。如果要仅检查相等的分钟,请将每个DateTime仅与该度数进行比较。有关舍入DateTimes的信息,请参阅here


A note about resolution

  

Now属性经常用于衡量性能。但是,由于其分辨率低,因此不适合用作基准测试工具。更好的选择是使用Stopwatch类。

答案 1 :(得分:3)

Assert fail方法可能在DateTime上调用ToString(),它返回截断的,人类可读的日期形式而没有毫秒组件。这就是为什么看起来它们是相等的,实际上,DateTime对象的精度为100纳秒(称为Tick)。这意味着两个DateTime对象极不可能具有完全相同的值。要进行比较,您可能希望截断该值,可能需要将日期格式化为您需要的保真度。

答案 2 :(得分:1)

你确定logoutTime和log.First()。时间戳都输入为DateTime?

如果是这样,它们对于更具体的时间信息(例如,毫秒)也可能具有不同的值。

答案 3 :(得分:1)

使用实体框架,如果您使用.AsNoTracking()从数据库中提取,DateTime属性将会略微舍入,而如果没有.AsNoTracking()则不会被舍入。原始值仍在内存中。因此,对于涉及到数据库往返的集成测试,我认为最好使用.ToString(),因为数据库会稍微降低精度。

答案 4 :(得分:0)

尝试Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks)

之类的内容

答案 5 :(得分:0)

我认为Assert.AreEqual<T>使用Object.Equals()来确定对象的相等性,而不是值。

这句话可能正在比较两个不同的对象,因此返回false。

答案 6 :(得分:0)

假设logoutTime和log.First()。Timestamp都是DateTime类型,你应该尝试使用它:

Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks);

答案 7 :(得分:0)

在进行单元测试时,我发现以下步骤对于将某个日期与模拟日期进行比较非常有用。

模拟日期字段如下:

mockDate = new DateTime(2020, 10, 10)

调用服务方法。

断言可以这样完成:

Assert.AreEqual("10/10/2020 12:00:00 AM", _service.startDate.ToString());

做断言时注意

  • 我们必须提供如下日期:10/10/2020 12:00:00 AM
  • 然后在服务方法日期项上我们需要应用ToString(),这会将日期时间转换为字符串值进行比较

如果我们只需要对今天的日期时间进行断言

Assert.AreEqual(DateTime.Today, _service.startDate);