2010-12-14 8 views
3

テストを書いていますが、テスト中に現在の日付を変更する方法があるのだろうか?テスト中に現在の日付をシミュレートします

重要な点は、アクションが呼び出されるたびにインスタンスを作成するトラッキングモデルに接続されているアプリケーションの統計機能をテストしていることです(一部のアクションのみが追跡されます)

だから私は私の分析コンポーネントは、右の計算を行っているテストするために、異なる時点で異なるコントローラでこのアクションを呼び出す必要がありますが、私は次のサンプルコードでchange_current_timeを実装する方法を見つけることができませんでした:

test "login count" do 
    change_current_time(2.day.ago) 
    get "users/login/testuser/testpassword" 
    assert login_count(2.day.ago) == 1 
    change_current_time(1.day.ago) 
    get "users/login/testuser/testpassword" 
    get "users/login/testuser1/testpassword1" 
    assert login_count(1.day.ago) == 2 
end 

答えて

5

この種のことをするための宝石がたくさんあります。私のお気に入りはデロリアンです:https://github.com/bebanjo/delorean

+0

がFUTURに戻すの引用のための余分な栄誉を与えるだろう、私はこの宝石を使用して大好き! – standup75

1

この種のテストを行う方法の1つは、メソッド/クラスをモックすることですあなたはテストしたい。

http://en.wikipedia.org/wiki/Mock_object

アイデアは、日付を渡す代わりに、現在の日付に頼る以外、同一の機能を作成し、代わりにそれをテストすることができます。難しさは、2つの機能が実際には同等であることを確認し、それらの変更を同期して保持することにあります。

モックのための既存のフレームワークなどがありますが、私はあなたに1つを推薦するのに十分に精通していません。

0

Railsに嘲笑いの宝石があります。
https://github.com/harvesthq/time-warp

time = (2.days.ago) 

pretend_now_is(time) do 
    get "users/login/testuser/testpassword" 
    assert login_count(Date.today) == 1 # it's stubbed 
end 

time = (1.days.ago) 

pretend_now_is(time) do 
    get "users/login/testuser/testpassword" 
    get "users/login/testuser1/testpassword1" 
    assert login_count(Date.today) == 2 
end 
関連する問題