endokのブログ

IT・プログラミングネタ

rspec3でJST日付を検証する

modelのdatetime型項目を検証する。

例えば下記のmodelを考える。

class CreateTasks < ActiveRecord::Migration                                                           
  def change
    create_table :tasks do |t|
      t.string :title
      t.datetime :deadline

      t.timestamps null: false
    end
  end                                                                                                 
end

'2015/01/01'でdeadlineを初期化後に

p task.deadline

すると

Thu, 01 Jan 2015 00:00:00 JST +09:00

と表示される。

この状態で

expect(task.deadline).to eq DateTime.new(2015,1,1)

とすると

Failure/Error: expect(task.deadline).to eq DateTime.new(2015,1,1)
       expected: Thu, 01 Jan 2015 00:00:00.000000000 +0000
       got: 2015-01-01 00:00:00.000000000 +0900

と言われてしまう。
DateTimeではタイムゾーンが反映されないのが原因?の模様。
Timeを使うとタイムゾーンが反映され、比較OKとなる。

expect(task.deadline).to eq Time.new(2015,1,1)


DateTimeとTimeの扱いは下記ページが詳しい。
RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い - Qiita