我的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());
答案 0 :(得分:42)
您是否确认滴答/毫秒数相等?
如果你两次背靠背DateTime.Now()
,它们看起来是同一个数字,直到分钟,甚至可能是第二,但它们通常会有不同的数字。 。如果要仅检查相等的分钟,请将每个DateTime仅与该度数进行比较。有关舍入DateTimes的信息,请参阅here
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());
做断言时注意:
如果我们只需要对今天的日期时间进行断言
Assert.AreEqual(DateTime.Today, _service.startDate);