Сбой теста форматирования времени в Rails, потому что у него один час? - PullRequest
3 голосов
/ 16 августа 2011

У меня есть следующий метод в одном из моих классов Rails:

def human_departure_time
  "#{departure_time.strftime("%A, %d %B %Y")} at #{departure_time.strftime("%I:%M %p")}"
end

Как видите, он просто берет атрибут datetime модели и форматирует его так, чтобы он был более дружественным для человека.

В любом случае, у меня есть следующий тест для этого метода:

describe "human_departure_time" do
  it "should output the time in readable format" do
    # first I use the Timecop gem to freeze the time
    Timecop.freeze(DateTime.now) do
      bus_time = DateTime.now + 1.days
      # factory a bus with a specific departure time
      bus = Factory :bus, departure_time: bus_time
      expected = "#{bus_time.strftime("%A, %d %B %Y")} at #{bus_time.strftime("%I:%M %p")}"
      # check that the output is as expected
      bus.human_departure_time.should == expected
    end
  end
end

Довольно просто, но тест проваливается на один час со следующим выводом:

Failures:

  1) Bus human_departure_time should output the time in readable format
     Failure/Error: bus.human_departure_time.should == expected
       expected: "Wednesday, 17 August 2011 at 03:13 AM"
            got: "Wednesday, 17 August 2011 at 02:13 AM" (using ==)
     # ./spec/models/bus_spec.rb:34:in `block (4 levels) in <top (required)>'
     # ./spec/models/bus_spec.rb:30:in `block (3 levels) in <top (required)>'

Вот мой автобусный завод, только что это важно. Я перезаписываю время отправления на время теста плюс один час.

factory :bus do
  origin_name "Drogheda"
  event_name "EP"
  departure_time { DateTime.now + 14.days }
end

Я полагаю, это связано с переходом на летнее время или что-то в этом роде? Как я могу исправить эту проблему?

1 Ответ

3 голосов
/ 16 августа 2011

ActiveRecord может автоматически преобразовывать атрибуты времени в вашей модели в местное время.

Вы можете попробовать использовать %Z параметр strftime, чтобы увидеть часовой пояс выведенной метки времени, чтобы увидеть, где возможное преобразование подкрадывается к вашему времени.

Некоторые подсказки в Google, которые могут иметь отношение:


default_timezone:

http://apidock.com/rails/ActiveRecord/Base/default_timezone/class


ActiveRecord::Base.time_zone_aware_attributes
config.active_record.time_zone_aware_attributes

http://tamersalama.com/2011/01/10/rails-disable-timezone-conversions/
https://mirrors.kilnhg.com/Repo/Mirrors/From-Git/Rails/History/70cb470c1ab8
http://www.ruby -forum.com / тема / 2096919
http://www.ruby -forum.com / topic / 890711


...