Time.now で指定した時間を返すようにする

Time.now を使うテストをしたくて、事前に設定した時間を Time.now が返すようにしてみた。Time._set_time に Time.parse が解析できる時間の文字列を指定し、Time.now を使うと、先ほど設定した時間を返すというものです。

require 'time'

class Time
  class << self
    alias time_now_original now
    @fixed_time = nil

    def _set_time(time = nil)
      if time.nil?
        @fixed_time = nil
      else
        @fixed_time = Time.parse(time)
      end
    end

    def now
      if @fixed_time.nil?
        self.time_now_original
      else
        @fixed_time
      end
    end
  end
end

Time._set_time("2008 12/12 12:12:12")

puts Time.now # => Sat Dec 12 12:12:12 +0900 2009
puts Time.now # => Sat Dec 12 12:12:12 +0900 2009
Time._set_time(nil)
puts Time.now # => Thu Jan 08 23:31:10 +0900 2009