module ActiveSupport::Testing::TimeHelpers
def simple_stubs
def simple_stubs @simple_stubs ||= SimpleStubs.new end
def travel(duration, &block)
end
User.create.created_at # => Sun, 10 Nov 2013 15:34:49 EST -05:00
travel 1.day do
Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
state at the end of the block:
This method also accepts a block, which will return the current time back to its original
DateTime.current # => Sun, 10 Nov 2013 15:34:49 -0500
Date.current # => Sun, 10 Nov 2013
Time.current # => Sun, 10 Nov 2013 15:34:49 EST -05:00
travel 1.day
Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
stubbing +Time.now+, +Date.today+, and +DateTime.now+.
Changes current time to the time in the future or in the past by a given time difference by
def travel(duration, &block) travel_to Time.now + duration, &block end
def travel_back
travel_back
Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
travel_to Time.new(2004, 11, 24, 01, 04, 44)
Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
`travel` and `travel_to`.
Returns the current time back to its original state, by removing the stubs added by
def travel_back simple_stubs.unstub_all! end
def travel_to(date_or_time)
end
Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
travel_to Time.new(2004, 11, 24, 01, 04, 44) do
Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
state at the end of the block:
This method also accepts a block, which will return the current time back to its original
leading to off-by-one-second errors).
errors with external services, like MySQL (which will round instead of floor,
Note that the usec for the time passed will be set to 0 to prevent rounding
please always use Time.current and Date.current.)
or Date.today, in order to honor the application time zone
be different. (Note that you rarely want to deal with Time.now,
Date.today the date according to Time.now, which may
Date.current returns a date equal to the argument, and
and Time.now its equivalent in the system time zone. Similarly,
application time zone. Time.current returns said timestamp,
Dates are taken as their timestamp at the beginning of the day in the
DateTime.current # => Wed, 24 Nov 2004 01:04:44 -0500
Date.current # => Wed, 24 Nov 2004
Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
travel_to Time.new(2004, 11, 24, 01, 04, 44)
Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
+Date.today+, and +DateTime.now+ to return the time or date passed into this method.
Changes current time to the given time by stubbing +Time.now+,
def travel_to(date_or_time) if date_or_time.is_a?(Date) && !date_or_time.is_a?(DateTime) now = date_or_time.midnight.to_time else now = date_or_time.to_time.change(usec: 0) end simple_stubs.stub_object(Time, :now) { at(now.to_i) } simple_stubs.stub_object(Date, :today) { jd(now.to_date.jd) } simple_stubs.stub_object(DateTime, :now) { jd(now.to_date.jd, now.hour, now.min, now.sec, Rational(now.utc_offset, 86400)) } if block_given? begin yield ensure travel_back end end end