Cal*_*bHC 3 ruby testing datetime ruby-on-rails
很长一段时间以来,我一直有这个问题,在一天的某个特定时间,我的测试中断了一小部分.我有很多测试正在进行简单的日期比较,从下午到下午4点,一切都运行良好.知道为什么会这样吗?我也在我的环境文件中设置了我的时区.
好像我的一些电话,如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) %>
Run Code Online (Sandbox Code Playgroud)
下午4:00之后,上面的测试失败并说它创建了6天而不是5 :(
你可能在太平洋时区,比UTC晚8小时(这就是为什么在4:00p他们开始打破,因为那时它是在午夜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"
Run Code Online (Sandbox Code Playgroud)
我的建议是.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"
Run Code Online (Sandbox Code Playgroud)
或者只是切换到使用1.day.from_now而不是Time.now.tomorrow保持类型一致.
| 归档时间: |
|
| 查看次数: |
679 次 |
| 最近记录: |