Как подделать Time.now? - PullRequest
       40

Как подделать Time.now?

70 голосов
/ 01 августа 2009

Какой лучший способ установить Time.now для тестирования чувствительных ко времени методов в модульном тесте?

Ответы [ 14 ]

0 голосов
/ 13 января 2011

Я всегда извлекаю Time.now в отдельный метод, который превращаю в attr_accessor в макете.

0 голосов
/ 10 августа 2010

У меня просто есть это в моем тестовом файле:

   def time_right_now
      current_time = Time.parse("07/09/10 14:20")
      current_time = convert_time_to_utc(current_date)
      return current_time
    end

и в моем файле Time_helper.rb у меня есть

  def time_right_now
    current_time= Time.new
    return current_time
  end

поэтому при тестировании time_right_now перезаписывается, чтобы использовать то время, которое вы хотите.

0 голосов
/ 04 августа 2009

В зависимости от того, с чем вы сравниваете Time.now, иногда вы можете изменить свои приборы для достижения той же цели или проверить ту же функцию. Например, у меня была ситуация, когда мне нужно было, чтобы одна вещь случилась, если какое-то свидание было в будущем, а другая - в прошлом. Что я смог сделать, так это включить в мои приборы встроенный рубин (эрб):

future:
    comparing_date: <%= Time.now + 10.years %>
    ...

past:
    comparing_date: <%= Time.now - 10.years %>
    ...

Затем в своих тестах вы выбираете, какой из них использовать для тестирования различных функций или действий в зависимости от времени относительно Time.now.

0 голосов
/ 04 августа 2009

Этот вид работ и допускает вложение:

class Time
  class << self
    attr_accessor :stack, :depth
  end

  def self.warp(time)

    Time.stack ||= [] 
    Time.depth ||= -1 
    Time.depth += 1
    Time.stack.push time

    if Time.depth == 0 
      class << self    
          alias_method :real_now, :now  
          alias_method :real_new, :new

          define_method :now do
            stack[depth] 
          end

          define_method :new do 
            now 
          end
      end 
    end 

    yield

    Time.depth -= 1
    Time.stack.pop 

    class << self 
      if Time.depth < 0 
        alias_method :new, :real_new
        alias_method :now, :real_now
        remove_method :real_new
        remove_method :real_now 
      end
    end

  end
end

Это может быть немного улучшено, отрывая стек и аксессоры глубины в конце

Использование:

time1 = 2.days.ago
time2 = 5.months.ago
Time.warp(time1) do 

  Time.real_now.should_not == Time.now

  Time.now.should == time1 
  Time.warp(time2) do 
    Time.now.should == time2
  end 
  Time.now.should == time1
end

Time.now.should_not == time1 
Time.now.should_not be_nil
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...