Ruby on rails Rails单元测试中的日期时间问题

Ruby on rails Rails单元测试中的日期时间问题,ruby-on-rails,datetime,Ruby On Rails,Datetime,我正在为我的Rails应用程序进行单元测试,遇到了以下问题 我有一个带有固定装置的事件模型,可以归结为: concert: name: Wallflowers start_at: <%= DateTime.new(1999) %> 测试失败,并显示以下消息: <Fri, 01 Jan 1999 00:00:00 +0000> expected but was <Thu, 31 Dec 1998 19:00:00 UTC +00:00&g

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

我有一个带有固定装置的事件模型,可以归结为:

concert:
  name:        Wallflowers
  start_at:    <%= DateTime.new(1999) %>
测试失败,并显示以下消息:

<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

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

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

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

经过一些测试,我发现在fixture中使用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)时,测试通过了。如果第一段中的解决方案不适用于您,请尝试将fixture更改为日期的字符串表示形式。

将其更改为此

concert:
  name: Wallflowers
  start_at: <%= DateTime.new(1999).to_s(:db) %>
音乐会: 名称:壁花 开始时间:
谢谢。最后,我选择了.to_s(:db)选项,因为它似乎提供了更大的灵活性。谢谢你的帮助。
concert:
  name: Wallflowers
  start_at: <%= DateTime.new(1999).to_s(:db) %>