Rails assert_equal не всегда работает с DateTimes

Я получаю сообщение об ошибке в своем функциональном тесте при использовании assert_equal:

  1) [31mFailure[0m:
test_should_allow_dealer_to_extend_offer:21
<Thu, 14 Apr 2011 23:59:59 PDT -07:00> expected but was
<Thu, 14 Apr 2011 23:59:59 PDT -07:00>.

Обратите внимание, что они показывают одно и то же время и часовой пояс. Я проверил, и они имеют один и тот же тип класса (ActiveSupport::TimeWithZone). Так почему они не равны?

Это стандартное поле DateTime в базе данных, которое, я думаю, хранится только до второго справа?

Я могу заставить его пройти, преобразовав их в целые числа или используя assert_in_delta с диапазоном 1 минута. Но просто поинтересовался.

Кстати, это Rails 2.3.8 и MySQL.


person Brian Armstrong    schedule 05.04.2011    source источник


Ответы (1)


Я тоже получаю ту же ошибку. Похоже, об этом сообщалось в 2009:

Я видел, как это происходило в тестах раньше - обычно это было вызвано тем, что база данных имела другое временное разрешение, чем система. Таким образом, несмотря на то, что два раза печатаются одинаково, один действительно (например) 15:45:32.012445362, а БД загружается обратно 15:45:32, что не сравнивается как равное.

Предлагаемое решение, которое сработало для меня:

В своих тестах вы можете попробовать принудить to_a перед сравнением; значение usec не возвращается в представлении to_a:

person Craig Walker    schedule 06.04.2011