Help us understand the problem. What is going on with this article?

timecop 使ってみた

More than 5 years have passed since last update.

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 万ぐらいするはず。
tyamagu2
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした