Почему мои тесты, связанные со временем, ломаются каждый день в 4 часа дня? - PullRequest
3 голосов
/ 04 февраля 2011

Долгое время у меня была такая проблема, что в определенное время дня ТОННА моих тестов ломалась. У меня есть много тестов, которые делают простые сравнения дат, и все работает нормально с полуночи до 4:00 дня. Есть идеи, почему это происходит? Я также установил часовой пояс в своем файле среды.

Похоже, что некоторые мои звонки, такие как 5.days.from_now.to_date, добавляют дополнительный день.

Редактировать

Например, этот тест не пройден:

# Widget that creates items for how many days the trip is gone.
def test_should_create_correct_amount_of_days_for_trip
  w = DayWidget.create(:trip => trips(:hawaii))
  assert_equal w.days.size, 5
end

# Code in trip model that calculates amount of days
def number_of_days
  (self.return_date.to_date - self.depart_date.to_date).to_i + 1
end

# Test fixture yaml for Hawaii
hawaii:
  depart_date: <%= Time.now.tomorrow.to_s(:db) %>
  return_date: <%= 5.days.from_now.to_s(:db) %>

После 16:00 вышеприведенный тест завершается неудачно и говорит, что он создал 6 дней вместо 5.: (

Ответы [ 3 ]

8 голосов
/ 04 февраля 2011

Вы, вероятно, находитесь в часовом поясе Тихого океана, на 8 часов меньше UTC (поэтому в 4:00 они начинают прорываться, поскольку именно тогда наступает полночь UTC).

Не видя ваш код теста / сравнения, все, что я могу сказать, это убедиться, что вы сравниваете даты / время с одним и тем же местоположением (UTC по UTC или местное время по местному времени).

Обновление: Хорошо, похоже, Time.now возвращает объект Time, тогда как использование XXX.days.from_now возвращает объект ActiveSupport::TimeWithZone, что приводит к различной обработке часовых поясов:

ruby-1.9.2-p136 :009 > (Time.now+5.days).to_s(:db)
 => "2011-02-08 19:40:24" 
ruby-1.9.2-p136 :010 > 5.days.from_now.to_s(:db)
 => "2011-02-09 03:40:29" 

Я бы порекомендовал вам либо позвонить по номеру .utc в ваши часы, например:

ruby-1.9.2-p136 :017 > 5.days.from_now.utc.to_s(:db)
 => "2011-02-09 03:42:39" 
ruby-1.9.2-p136 :018 > (Time.now+5.days).utc.to_s(:db)
 => "2011-02-09 03:42:39" 

или просто переключиться на использование 1.day.from_now вместо Time.now.tomorrow для сохранения согласованности типов.

1 голос
/ 06 сентября 2012

Вы также можете использовать Time.current вместо Time.now.

Time.current возвращает ActiveSupport::TimeWithZone так же, как #ago и #from_now, так что вы можете безопасно сравнитьдаты, возвращенные ими.

0 голосов
/ 04 февраля 2011

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

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