47

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

4

8 回答 8

44

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

如果你DateTime.Now()背靠背做两次,它们看起来是相同的数字到分钟甚至可能甚至到,但它们通常会因滴答声而变化。如果您只想检查是否相等,请仅将每个 DateTime 与该程度进行比较。有关四舍五入 DateTimes 的信息,请参见此处


关于分辨率的说明

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

于 2010-04-28T18:38:39.400 回答
4

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

于 2010-04-28T18:47:43.997 回答
3

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

于 2010-04-28T18:42:13.610 回答
2

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

于 2016-06-08T17:26:56.543 回答
1

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

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

于 2010-04-28T18:39:10.537 回答
0

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

Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks);
于 2010-04-28T18:42:27.373 回答
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);
于 2021-06-01T05:56:09.510 回答
-1

我想Assert.AreEqual<T>用于Object.Equals()确定对象的相等性而不是值的相等性。

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

于 2010-04-28T18:42:24.150 回答