2011-07-27 3 views
12

私はTimecopの組み合わせを使用してデータにwhere_sqlを照会しようとしていますが、実際に時間を止めるためにTimecopを取得することはできません。 Timecop.freezeとTimecop.freeze(Time.now)を試してみました。どちらも、私の仕様にTime.nowを使用しているときは少しオフになっています。仕様でTimecopを使って時間を正しく凍結させる方法はありますか?

私には何が欠けていますか? Rubyの1.9.2、Railsは3.1.0.rc5

-

エラー

Failure/Error: Game.unreleased.arel.where_sql.should eq("WHERE (release_date > '#{Time.now}')") 


    expected "WHERE (release_date > '0000-01-01 00:00:00 -0500')" 
    got "WHERE (release_date > '0000-01-01 05:00:00.000000')" 

モデル

scope :unreleased, lambda { |limit = 4| where('release_date > ?', Time.now). 
             order('release_date asc'). 
             limit(limit) } 

スペック

it "should retrieve games with a release date later than today" do 
    Timecop.freeze 
    Game.unreleased.arel.where_sql.should eq("WHERE (release_date > '#{Time.now}')") 
end 
+0

タイムコードだとは思えませんが、タイムスタンプ形式の問題です。今すぐその部分を見つけてください。 –

答えて

22

timecopの私の使い方で仕様は常に次のようになります:

Timecop.travel(Time.zone.local(2010, 6, 1, 13, 0, 0)) do 
    .. time sensitive spec here .. 
end 

これは、レールのアプリで時間を扱うときにTime.zoneプロキシ(などTime.zone.now、Time.zone.utc、Time.zone.localを、)を使用することも一般的に良い練習です。時間が一致していなかった場合は

it "updates :completed_at" do 
    Timecop.freeze 
    expect(@task.completed_at).to eq(Time.zone.now) 
end 

+1

where句で使用されている正しいタイムスタンプ形式を表示するには問題はありますが、Timecopの答えは正しいです。 –

2

は、私はちょうど私が実行していたとき、RSpecののexpect構文でTimecopを実行している問題を抱えていました。解決するために、私は句にTimecop.freezeを入れます。

(私はこの質問が古い実現し、RSpecののexpect構文が周りではなかったが、私は元の質問で述べた同じ問題を抱えている人々を助けることがbeforeブロックまたは句にTimecop.freezeを追加すると思います。確かに、それはdoesnの。トン)新しい質問をすると、私の質問は、上記の1と非常に非常に類似しているので、それは価値がある答えのように思える日まで

1

旅行やTimeHelpersが含まれ、例:この近くに見れ

include ActiveSupport::Testing::TimeHelpers 

let!(:archived_date) { Time.zone.now } 

travel_to(archived_date) do 
    expect(OrderService.getOrder(some_old_order).archived_at).to eq Time.zone.now 
end 
+0

あなたは良い点を作っていますが、質問に直接答えているわけではありません。したがって、あなたはもっと明示すべきです:あなたは 'Timecop'ではなく、Railsヘルパーメソッド(' travel_to')を使っています*この方法は* Rails 4.1 *から利用できます。 – einjohn

関連する問題