Timecopを使ってみた

概要

ReadMeに、

A gem providing "time travel" and "time freezing" capabilities, making it dead simple to test time-dependent code. 
It provides a unified method to mock Time.now, Date.today, and DateTime.now in a single call.

とあるように、時間を止めたり、時間を進めたりすることができるライブラリ。 中の動きとしてはTIme.now とか、Date.today とかを指定した日時でモックしたり、時間のを進まないようにしてくれる。

Github

使い方

時間を止める

now = Time.Now  # => 2014-01-26 14:18:46 +0900

# 時間を止める
Timecop.freeze(now)

p Time.now # => 2014-01-26 14:18:46 +0900

時間を特定に日時に変更する

t = Time.local(2012, 1, 1, 0, 0, 0)

# 現在時刻をtに変更する
Timecop.travel(t)

sleep(1)
p Time.now # => 2012-01-01 00:00:01 +0900

1秒で進む秒数を変更する

# scaleを10secに変更する
Timecop.scale(10)

5.times.each do
  p Time.now
  sleep(1)
end

# => 2014-01-26 14:13:10 +0900
# => 2014-01-26 14:13:20 +0900
# => 2014-01-26 14:13:30 +0900
# => 2014-01-26 14:13:40 +0900
# => 2014-01-26 14:13:50 +0900

do ~ end で括るか、Timecop.returnを呼ぶとこれらは解除される模様。