rspec で時間を操作したかったので delorean を使おうとしたけど、timecop のほうが機能も多いし、GitHub の Star も 400 対 1500 だし、delorean 全然アクティブじゃないし、ってことで timecop 試してみました。
(書いてある内容は readme とほぼ一緒です。)
感想
timecop いいんじゃないでしょうか。delorean もそんなに使ったことあるわけじゃないのであんまり比較できないですが。そして delorean って名前のほうがいけてるけど。
freeze、scale は delorean にはない機能っぽい。scale なんかは実際に時間を進行させたうえでテストしたいときに便利。
機能
travel
指定した時間に移動する。移動したあとも時間が進む。
Time.now
=> 2014-12-01 10:46:12 +0900
# 指定した時間に移動
Timecop.travel(Time.now + 1.years)
=> 2015-12-01 10:46:23 +0900
Time.now # その後も時間が進み続ける
=> 2015-12-01 10:46:29 +0900
# もう一度 travel すると、これまでの分も累計して移動
Timecop.travel(Time.now + 1.years)
=> 2016-12-01 10:46:31 +0900
freeze
指定した時間で時を止める!ザ・ワールド
Time.now
=> 2014-12-01 10:59:17 +0900
# 今度は過去に移動して、時間を止める
Timecop.freeze(Time.now - 6.months)
=> 2014-06-01 10:59:30 +0900
# いくら時間がたっても
sleep(5)
# 時間が変わらない!
Time.now
=> 2014-06-01 10:59:30 +0900
# こちらも累計して移動できる
Timecop.freeze(Time.now - 6.months)
=> 2013-12-01 10:59:30 +0900
scale
時間の進み具合を調整できる。現実に 1 秒進むごとに何秒進んだことにするかを係数で指定できる。
# 1 秒進むごとに 60 * 60 = 3600 秒 = 1 時間進んだことにする
Timecop.scale(3600)
Time.now
=> 2014-12-01 12:54:42 +0900
# ほんの数秒で半日すすんだ!
Time.now
=> 2014-12-01 23:02:51 +0900
return
timecop の影響を取り消す。
Timecop.freeze(Time.now + 100.years)
Time.now
=> 2114-12-01 11:09:23 +0900
Timecop.return
Time.now
=> 2014-12-01 11:09:30 +0900
safe_mode
ブロックの中でのみ timecop の影響が出るようにする。
# safe mode を有効にする
Timecop.safe_mode = true
# 有効になっていることを確認
Timecop.safe_mode?
=> true
Timecop.freeze(Time.now + 100.years) do
# 1. 時間が移動する
Time.now # => 2114-12-01 12:47:38 +0900
Timecop.freeze(Time.now + 100.years) do
# 2. さらに移動する
Time.now # => 2214-12-01 12:47:38 +0900
end
# 1 の段階まで時間がもどる
Time.now # => 2114-12-01 12:47:38 +0900
end
# 元の時間に戻る
Time.now
=> 2014-12-01 12:47:41 +0900
# ブロックなしだと例外が発生
Timecop.freeze(Time.now + 100.years)
=> Timecop::SafeModeException: Safe mode is enabled, only calls passing a block are allowed.
travel、freeze の時間指定方法
- Time インスタンス
- DateTime インスタンス
- Date インスタンス
- year, month, day, hour, minute, second の個別指定
- Time.now からのオフセットを表す整数
timecop の影響を受けるもの
- Time.now
- Date.today
- DateTime.now
余談
- delorean は Back to the Future から、timecop はこれかな?
- 前の会社で delorean に乗ってる部長さんがいた。あれたしか 500 万ぐらいするはず。