66
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

timecop 使ってみた

Posted at

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 万ぐらいするはず。
66
44
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?