为什么我的时间相关单元测试每天下午4点都会中断?

时间:2011-02-04 02:57:40

标签: ruby-on-rails ruby testing datetime

很长一段时间以来,我一直有这个问题,在一天中的某个时间,我的测试中有一小部分被打破。我有很多测试正在进行简单的日期比较,从下午到下午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) %>

在下午4:00之后,上面的测试失败并说它创建了6天而不是5 :(

3 个答案:

答案 0 :(得分:8)

你可能在太平洋时区,比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" 

我的建议是在您的灯具上按时间拨打.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 :(得分:1)

您也可以使用Time.current代替Time.now

Time.current返回ActiveSupport::TimeWithZone,就像#ago#from_now一样,因此您可以安全地比较它们返回的日期。

答案 2 :(得分:0)

如果您真的只处理日期,请务必将小时,分钟和秒设置为0,否则您将受制于创建日期的时间。