Почему дата и время не могут сравниться? - PullRequest
39 голосов
/ 28 апреля 2010

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

Ответы [ 7 ]

42 голосов
/ 28 апреля 2010

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

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


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

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

3 голосов
/ 28 апреля 2010

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

1 голос
/ 08 июня 2016

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

1 голос
/ 28 апреля 2010

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

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

0 голосов
/ 28 апреля 2010

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

Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks);
0 голосов
/ 28 апреля 2010

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

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

0 голосов
/ 28 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...