【问题标题】:Why datetime cannot compare?为什么日期时间不能比较?
【发布时间】:2011-02-13 12:04:18
【问题描述】:

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

【问题讨论】:

标签: c# unit-testing datetime-comparison


【解决方案1】:

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

模拟日期字段如下:

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(),这会将日期时间转换为字符串值进行比较

如果我们只需要用 datetime 今天日期做断言

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您是否验证过滴答数/毫秒数是否相等?

      如果您连续两次执行DateTime.Now(),它们会显示为相同的数字到分钟甚至可能甚至到,但它们通常会因滴答声而变化。如果您只想检查是否相等,请仅将每个 DateTime 与该程度进行比较。有关四舍五入 DateTimes 的信息,请参阅here


      A note about resolution:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我想Assert.AreEqual&lt;T&gt; 使用Object.Equals() 来确定对象的相等性而不是值的相等性。

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            • 这将做完全相同的事情,除了在异常消息中显示不同的刻度值。
            【解决方案7】:

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

            【讨论】:

            • 正如 Jon Skeet 在 jlech 的回答中所说:“除了在异常消息中显示不同的刻度值之外,这将做完全相同的事情。”
            • 没错,它会告诉你为什么这两个值不相等。
            【解决方案8】:

            您确定 logoutTime 和 log.First().Timestamp 都输入为 DateTime?

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

            【讨论】:

              猜你喜欢
              • 2021-04-23
              • 2017-11-11
              • 2012-12-29
              • 1970-01-01
              • 1970-01-01
              • 2023-03-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多