модуль ActiveSupport::Testing::TimeHelpers
Содержит вспомогательные функции, помогающие тестировать течение времени.
Общедоступные методы экземпляров
# File activesupport/lib/active_support/testing/time_helpers.rb, line 63 def travel(duration, &block) travel_to Time.now + duration, &block end
Изменяет текущее время на будущее или прошлое время на заданное временное различие, подменяя Time.now, Date.today, и DateTime.now.
Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00 travel 1.day Time.current # => Sun, 10 Nov 2013 15:34:49 EST -05:00 Date.current # => Sun, 10 Nov 2013 DateTime.current # => Sun, 10 Nov 2013 15:34:49 -0500
Этот метод также принимает блок, который вернёт текущее время в исходное состояние в конце блока:
Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00 travel 1.day do User.create.created_at # => Sun, 10 Nov 2013 15:34:49 EST -05:00 end Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
# File activesupport/lib/active_support/testing/time_helpers.rb, line 125 def travel_back simple_stubs.unstub_all! end
Возвращает текущее время в исходное состояние, удалив подстановки, добавленные методами `travel` и `travel_to`.
Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00 travel_to Time.new(2004, 11, 24, 01, 04, 44) Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00 travel_back Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
# File activesupport/lib/active_support/testing/time_helpers.rb, line 97
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 Изменяет текущее время на заданное время, подменяя Time.now, Date.today, и DateTime.now, чтобы вернуть переданное в этот метод время или дату.
Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00 travel_to Time.new(2004, 11, 24, 01, 04, 44) Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00 Date.current # => Wed, 24 Nov 2004 DateTime.current # => Wed, 24 Nov 2004 01:04:44 -0500
Даты воспринимаются как отметка времени в начале дня в часовом поясе приложения. Time.now возвращает указанную отметку времени, а Time.current её эквивалент в системном часовом поясе. Аналогично, Date.current возвращает дату, равную аргументу, а Date.today дату в соответствии с Time.now, которая может отличаться. (Обратите внимание, что вам редко нужно работать с Time.now, или Date.today, чтобы сохранить часовой пояс приложения, всегда используйте Time.current и Date.current.)
Обратите внимание, что usec для переданного времени будет установлено в 0, чтобы предотвратить ошибки округления при работе с внешними сервисами, такими как MySQL (который округляет, а не усекает, что может привести к ошибкам с точностью до секунды).
Этот метод также принимает блок, который вернёт текущее время в исходное состояние в конце блока:
Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00 travel_to Time.new(2004, 11, 24, 01, 04, 44) do Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00 end Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.