Spec-Zone.ru › Ruby on Rails 7.0

module ActiveSupport::Testing::TimeHelpers

Содержит вспомогательные функции, которые помогают тестировать течение времени.

Публичные методы экземпляра

after_teardown() Show source
# File activesupport/lib/active_support/testing/time_helpers.rb, line 70
def after_teardown
  travel_back
  super
end
Вызывает метод суперкласса
freeze_time(&block) Show source
# File activesupport/lib/active_support/testing/time_helpers.rb, line 234
def freeze_time(&block)
  travel_to Time.now, &block
end

Вызывает travel_to с Time.now.

Time.current # => Sun, 09 Jul 2017 15:34:49 EST -05:00
freeze_time
sleep(1)
Time.current # => Sun, 09 Jul 2017 15:34:49 EST -05:00

Этот метод также принимает блок, который вернет текущее время в его исходное состояние в конце блока:

Time.current # => Sun, 09 Jul 2017 15:34:49 EST -05:00
freeze_time do
  sleep(1)
  User.create.created_at # => Sun, 09 Jul 2017 15:34:49 EST -05:00
end
Time.current # => Sun, 09 Jul 2017 15:34:50 EST -05:00
travel(duration, &block) Show source
# File activesupport/lib/active_support/testing/time_helpers.rb, line 93
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
travel_back() { || ... } Show source
# File activesupport/lib/active_support/testing/time_helpers.rb, line 208
def travel_back
  stubbed_time = Time.current if block_given? && simple_stubs.stubbed?

  simple_stubs.unstub_all!
  yield if block_given?
ensure
  travel_to stubbed_time if stubbed_time
end

Возвращает текущее время в его исходное состояние, удаляя заглушки, добавленные travel, travel_to и freeze_time.

Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00

travel_to Time.zone.local(2004, 11, 24, 1, 4, 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

Этот метод также принимает блок, который возвращает заглушки в конце блока:

Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00

travel_to Time.zone.local(2004, 11, 24, 1, 4, 44)
Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00

travel_back do
  Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
end

Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
Также является псевдонимом для: unfreeze_time
travel_to(date_or_time) { || ... } Show source
# File activesupport/lib/active_support/testing/time_helpers.rb, line 128
      def travel_to(date_or_time)
        if block_given? && in_block
          travel_to_nested_block_call = <<~MSG

      Calling `travel_to` with a block, when we have previously already made a call to `travel_to`, can lead to confusing time stubbing.

      Instead of:

         travel_to 2.days.from_now do
           # 2 days from today
           travel_to 3.days.from_now do
             # 5 days from today
           end
         end

      preferred way to achieve above is:

         travel 2.days do
           # 2 days from today
         end

         travel 5.days do
           # 5 days from today
         end

          MSG
          raise travel_to_nested_block_call
        end

        if date_or_time.is_a?(Date) && !date_or_time.is_a?(DateTime)
          now = date_or_time.midnight.to_time
        elsif date_or_time.is_a?(String)
          now = Time.zone.parse(date_or_time)
        else
          now = date_or_time.to_time.change(usec: 0)
        end

        stubbed_time = Time.now if simple_stubs.stubbing(Time, :now)
        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
            self.in_block = true
            yield
          ensure
            if stubbed_time
              travel_to stubbed_time
            else
              travel_back
            end
            self.in_block = false
          end
        end
      end

Изменяет текущее время на заданное время, заглушая Time.now, Date.today и DateTime.now, чтобы возвращать время или дату, переданные в этот метод. Заглушки автоматически удаляются в конце теста.

Time.current     # => Sat, 09 Nov 2013 15:34:49 EST -05:00
travel_to Time.zone.local(2004, 11, 24, 1, 4, 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.current возвращает указанную метку времени, а Time.now её эквивалент в системном часовом поясе. Аналогично, Date.current возвращает дату, равную аргументу, а Date.today дату в соответствии с Time.now, которая может отличаться. (Обратите внимание, что вы редко хотите работать с Time.now или Date.today, чтобы учитывать часовой пояс приложения, всегда используйте Time.current и Date.current.)

Обратите внимание, что микросекунды для переданного времени будут установлены в 0, чтобы предотвратить ошибки округления с внешними службами, такими как MySQL (которая будет округлять вместо отбрасывания, что приведет к ошибкам на одну секунду).

Этот метод также принимает блок, который вернет текущее время в его исходное состояние в конце блока:

Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
travel_to Time.zone.local(2004, 11, 24, 1, 4, 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
unfreeze_time()
Псевдоним для: travel_back

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API