Подтвердить что ты не робот

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

my С# unit test имеет следующее утверждение:

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>.

Разве они не то же самое?

Update:

Используйте это, если хотите только второй:

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

4b9b3361

Ответ 1

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

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


Заметка о разрешении:

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

Используя сущность-фреймворк, если вы извлекаете из базы данных с помощью .AsNoTracking() свойство DateTime будет округлено до такой степени, но оно не обязательно будет округлено без .AsNoTracking(), если исходное значение все еще находится в памяти. Таким образом, для тестов интеграции, связанных с обращением к базе данных, я думаю, что лучше использовать .ToString(), потому что база данных немного снизит точность.

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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