Rails 时间格式化测试因休息一小时而失败?

发布于 2024-11-29 18:00:37 字数 1513 浏览 0 评论 0原文

我的 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

我认为这与夏令时或其他什么有关?我该如何解决这个问题?

I have the following method in one of my Rails classes:

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

As you can see, it just takes a datetime attribute of the model and formats it so that it is more human friendly.

Anyway, I have the following test for this method:

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

Pretty simple but the test fails by one hour with the following output:

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)>'

Here is my bus factory just incase that is important. I'm overwriting the departure time with the frozen time plus one hour in my test.

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

I assume this is something to do with daylight savings time or something? How can I fix this issue?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

若有似无的小暗淡 2024-12-06 18:00:37

ActiveRecord 可以自动将模型中的时间属性转换为本地时间。

您可以尝试使用 strftime%Z 参数来查看输出时间戳的时区,以了解可能的转换潜入您的时间的位置。

一些可能相关的 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/topic/2096919
http://www.ruby-forum.com/topic/890711


ActiveRecord could be automatically converting time attributes in your model to local time.

You can try and use the %Z parameter of strftime to see the time zone of the outputted timestamp to see where a possible conversion is sneaking into your time.

Some Googled hints that might be relevant:


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/topic/2096919
http://www.ruby-forum.com/topic/890711


~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文