2009-12-21 77 views
4

我正在为我的Rails应用程序进行单元测试,并遇到以下问题。DateTime问题在Rails单元测试

我有一个固定的活动模式,可以归结为:

concert: 
    name:  Wallflowers 
    start_at: <%= DateTime.new(1999) %> 

在我的单元测试,我有以下的说法:

assert_equal DateTime.new(1999), events(:concert).start_at 

测试失败,并显示以下消息:

<Fri, 01 Jan 1999 00:00:00 +0000> expected but was 
<Thu, 31 Dec 1998 19:00:00 UTC +00:00>. 

我不明白为什么它得到调整。不正确时间的偏移量是5小时,这是我的本地偏移量。

其他信息,可能是相关的:

  • 仅在检测过程中出现的问题 - 我没有在任何发展问题
  • environment.rb中包含config.time_zone =“UTC”
  • 测试如果我使用Date.new而不是DateTime.new,但我需要使用DateTime

我错过了什么?感谢帮助。

回答

4

ActiveRecord会自动将所有插入的时间戳转换为UTC。这解释了为什么您的演唱会时间调整到不同的时区。第一步是通过将environment.rb中的config.time_zone设置为您的时区来查看问题是否得到解决。

如果不解决这个问题,请继续阅读:

一些测试后,我发现,似乎有一些差异,在照明系统中采用的DateTime相比控制器相同的代码。如果我在我的控制器中使用了DateTime.new(1999),插入的列是1999-01-01 00:00:00。如果我在夹具中使用相同的呼叫,插入的列是1999-01-01 10:30:00,这是我的时区。这与config.time_zone设置为什么无关。

在这两种情况下,正确更改时区都会更改从数据库中提取的ActiveRecord对象。

事实上,我不知道哪个是正确的表示。我知道测试通过时,我将灯具更改为'1999-01-01 00:00',而不是使用DateTime.new(1999)。如果第一段中的解决方案不适合您,请尝试将灯具更改为日期的字符串表示形式。

+0

感谢。最终,我只是使用.to_s(:db)选项,因为这似乎提供了更大的灵活性。感谢你的帮助。 – 2009-12-21 14:09:03

7

改成这样

concert: 
    name: Wallflowers 
    start_at: <%= DateTime.new(1999).to_s(:db) %> 
+0

这个作品 - 谢谢! – 2009-12-21 14:10:11