Проблема DateTime в модульных тестах Rails - PullRequest
4 голосов
/ 21 декабря 2009

Я работаю над модульными тестами для моего приложения Rails и столкнулся со следующей проблемой.

У меня есть модель Event с прибором, который сводится к:

concert:
  name:        Wallflowers
  start_at:    <%= DateTime.new(1999) %>

В моем модульном тесте у меня есть следующее утверждение:

assert_equal DateTime.new(1999), events(:concert).start_at

Тест не пройден со следующим сообщением:

<Fri, 01 Jan 1999 00:00:00 +0000> expected but was
<Thu, 31 Dec 1998 19:00:00 UTC +00:00>.

Я не могу понять, почему это настраивается. Смещение неправильного времени составляет 5 часов, что является моим локальным смещением.

Другая информация, которая может иметь отношение к делу:

  • Проблема возникает только во время тестирования - у меня нет проблем в разработке
  • environment.rb содержит config.time_zone = 'UTC'
  • Тест работает, если я использую Date.new вместо DateTime.new, но мне нужно использовать DateTime

Что мне не хватает? Ценю помощь.

Ответы [ 2 ]

7 голосов
/ 21 декабря 2009

Измените это на

concert:
  name: Wallflowers
  start_at: <%= DateTime.new(1999).to_s(:db) %>
4 голосов
/ 21 декабря 2009

ActiveRecord автоматически преобразует все вставленные временные метки в UTC. Это объясняет, почему ваше концертное время настроено на другой часовой пояс. Первым шагом будет посмотреть, решена ли проблема, если вы установили config.time_zone в environment.rb в свой часовой пояс.

Если это не решит проблему, читайте дальше:

После некоторого тестирования я обнаружил, что, по-видимому, существуют некоторые расхождения с использованием DateTime в приборах по сравнению с тем же кодом в контроллере. Если я использовал DateTime.new (1999) в моем контроллере, вставленный столбец был 1999-01-01 00: 00: 00 . Если я использовал тот же вызов в своем приборе, вставленный столбец был 1999-01-01 10: 30: 00 , который является моим часовым поясом. Это было независимо от того, какое значение было установлено для config.time_zone.

В обоих случаях правильное изменение часового пояса приводило к изменению объекта ActiveRecord, получаемого из базы данных.

По правде говоря, я не знаю, какое представление является правильным. Я знаю, что тест прошел, когда я изменил прибор на 1999-01-01 00:00 вместо использования DateTime.new (1999). Если решение в первом абзаце не работает для вас, попробуйте изменить осветитель на строковое представление даты.

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