1. ホーム
  2. ruby-on-rails

[解決済み] RSpecでの時間比較の問題

2022-06-01 16:35:33

質問

Ruby on Rails 4とrspec-rails gem 2.14を使用しています。あるオブジェクトについて、現在の時刻を updated_at オブジェクトの属性を比較したいのですが、specが通らないので困っています。つまり、以下がspecのコードであることを考えると。

it "updates updated_at attribute" do
  Timecop.freeze

  patch :update
  @article.reload
  expect(@article.updated_at).to eq(Time.now)
end

上記のspecを実行すると、以下のエラーが発生します。

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 ==)

どうすればspecが通るようになりますか?


ノート : 次のようなものも試してみました。 utc の追加に注意)。

it "updates updated_at attribute" do
  Timecop.freeze

  patch :update
  @article.reload
  expect(@article.updated_at.utc).to eq(Time.now)
end

を追加しましたが、この仕様はまだ通過しません ("got" の値の違いに注意してください)。

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 ==)

どのように解決するのですか?

RubyのTimeオブジェクトは、データベースよりも高い精度を保っています。 データベースから値を読み出すと、マイクロ秒の精度しか保たれませんが、インメモリ表現ではナノ秒の精度が保たれます。

もしミリ秒の差を気にしないのであれば、期待値の両側でto_s/to_iを行うことができます。

expect(@article.updated_at.utc.to_s).to eq(Time.now.to_s)

または

expect(@article.updated_at.utc.to_i).to eq(Time.now.to_i)

参照先 この を参照してください。