【发布时间】:2013-12-22 13:47:09
【问题描述】:
我正在使用 Ruby on Rails 4 和 rspec-rails gem 2.14。对于我的对象,我想在控制器操作运行后将当前时间与 updated_at 对象属性进行比较,但由于规范未通过,我遇到了麻烦。也就是说,给定以下是规范代码:
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at).to eq(Time.now)
end
当我运行上述规范时,我收到以下错误:
Failure/Error: expect(@article.updated_at).to eq(Time.now)
expected: 2013-12-05 14:42:20 UTC
got: Thu, 05 Dec 2013 08:42:20 CST -06:00
(compared using ==)
我怎样才能使规范通过?
注意:我还尝试了以下方法(注意utc 添加):
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at.utc).to eq(Time.now)
end
但规范仍然没有通过(注意“得到”值的差异):
Failure/Error: expect(@article.updated_at.utc).to eq(Time.now)
expected: 2013-12-05 14:42:20 UTC
got: 2013-12-05 14:42:20 UTC
(compared using ==)
【问题讨论】:
-
它正在比较对象 ID,因此检查的文本是匹配的,但在下面你有两个不同的 Time 对象。您可以只使用
===,但这可能会因跨越第二个边界而受到影响。最好的办法可能是找到或编写自己的匹配器,在其中转换为纪元秒并允许存在小的绝对差异。 -
如果我理解您所说的“跨越第二个界限”,那么问题应该不会出现,因为我使用的是“冻结”时间的 Timecop gem。
-
啊,我错过了,对不起。在这种情况下,只需使用
===而不是==- 目前您正在比较两个不同 Time 对象的 object_id。虽然 Timecop 不会冻结数据库服务器时间。 . .因此,如果您的时间戳是由 RDBMS 生成的,它将无法工作(我希望这对您来说不是问题)
标签: ruby-on-rails ruby time rspec comparison