Почему дата и время не может выдержать сравнение?

мой модульный тест 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());

41
задан abatishchev 14 October 2014 в 17:47
поделиться

6 ответов

Вы проверили, что количество тиков / миллисекунд одинаково?

Если вы выполните DateTime.Now () дважды подряд, они будут отображаться с точностью до минуты. и, возможно, даже до секунды , но они часто будут меняться в зависимости от тиков. Если вы хотите проверить равенство только до минуты, сравнивайте каждый DateTime только до этой степени. Для получения информации об округлении DateTimes см. здесь


Примечание о разрешении :

Свойство Now часто используется для измерения производительности. Однако из-за низкого разрешения он не подходит для использования в качестве инструмента тестирования. Лучшей альтернативой является использование класса Секундомер .

42
ответ дан 27 November 2019 в 00:52
поделиться

Предполагая, что logoutTime и log.First (). Timestamp имеют тип DateTime, вы должны попробовать использовать это вместо:

Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks);
0
ответ дан 27 November 2019 в 00:52
поделиться

Я полагаю, Assert.AreEqual использует Object.Equals () для определения равенства объектов, но не значений.

Вероятно, этот оператор сравнивает два разных объекта и поэтому возвращает false.

-1
ответ дан 27 November 2019 в 00:52
поделиться

Вы уверены, что logoutTime и log.First (). Timestamp оба набраны как DateTime?

Если да, они также могут иметь разные значения для более конкретной информации о времени (например, миллисекунды).

1
ответ дан 27 November 2019 в 00:52
поделиться

Метод сбоя Assert, вероятно, вызывает ToString () в DateTime, который возвращает усеченную, удобочитаемую форму даты без компонент миллисекунд. Вот почему кажется, что они равны, когда на самом деле объект DateTime имеет точность в 100 наносекунд (известную как Tick ). Это означает, что маловероятно, что два объекта DateTime будут иметь одно и то же значение. Для сравнения вы, вероятно, захотите усечь значение, возможно, отформатировав дату до требуемой точности.

3
ответ дан 27 November 2019 в 00:52
поделиться

Попробуйте что-нибудь вроде Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks)

1
ответ дан 27 November 2019 в 00:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: