我正在使用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 ==)
===
代替==
-当前正在比较两个不同的Time对象的object_id。尽管Timecop不会冻结数据库服务器的时间。。。因此,如果您的时间戳是由RDBMS生成的,则它将不起作用(我希望这对您来说不是问题)
===
,但是可能会遇到跨越第二个边界的问题。最好是找到或编写自己的匹配器,在该匹配器中,您将转换为新纪元,并允许一个很小的绝对差。