Rails单元测试中的DateTime问题

Mat*_*zur 5 datetime ruby-on-rails

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

我有一个带有夹具的事件模型,归结为:

concert:
  name:        Wallflowers
  start_at:    <%= DateTime.new(1999) %>
Run Code Online (Sandbox Code Playgroud)

在我的单元测试中,我有以下断言:

assert_equal DateTime.new(1999), events(:concert).start_at
Run Code Online (Sandbox Code Playgroud)

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

<Fri, 01 Jan 1999 00:00:00 +0000> expected but was
<Thu, 31 Dec 1998 19:00:00 UTC +00:00>.
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么要调整它.不正确时间的偏移量是5小时,这是我的本地偏移量.

其他可能相关的信息:

  • 问题只发生在测试时 - 我在开发过程中没有任何问题
  • environment.rb包含config.time_zone ='UTC'
  • 如果我使用Date.new而不是DateTime.new,测试工作,但我需要使用DateTime

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

fro*_*r78 7

把它改成这个

concert:
  name: Wallflowers
  start_at: <%= DateTime.new(1999).to_s(:db) %>
Run Code Online (Sandbox Code Playgroud)


von*_*rad 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) 时,测试通过了。如果第一段中的解决方案不适合您,请尝试将固定装置更改为日期的字符串表示形式。