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 ==)
===
代わりにを使用し==
てください。現在、2つの異なるTimeオブジェクトのobject_idを比較しています。Timecopはデータベースサーバーの時間を凍結しませんが。。。したがって、タイムスタンプがRDBMSによって生成されている場合は機能しません(ただし、ここでは問題ではないと思います)
===
、2番目の境界を超えると問題が発生する可能性があります。おそらく最良の方法は、独自のマッチャーを見つけるか記述することです。この場合、エポック秒に変換し、小さな絶対差を許容します。