Time.travel_to

Time.now                               # => Tue Nov 06 23:50:31 -0800 2007
Time.travel_to(1.day.ago) { Time.now } # => Mon Nov 05 23:50:47 -0800 2007
class Time
  class << self
    def travel_to(value, &block)
      self.offset = Time.now.utc - value.to_time.utc
      yield if block_given?
    ensure
      self.offset = nil
    end
 
    def now_with_time_travel
      now_without_time_travel - (traveling? ? offset : 0)
    end
 
    alias_method_chain :now, :time_travel
 
    private
 
    def traveling?
      offset
    end
 
    def offset
      Thread.current[:time_travel_offset]
    end
 
    def offset=(value)
      Thread.current[:time_travel_offset] = value
    end
  end # of class methods
end

About this entry