Onze dagmethode #14: Time#warp

Geplaatst door Remco van 't Veer vr, 22 feb 2008 08:00:00 GMT

Tijdreizen is verschrikkelijk handig maar jammer genoeg niet altijd even gemakkelijk. Als de realiteit het niet toestaat dan passen die gewoon aan!


class Time
  def self.now_with_warping
    @warptime || now_without_warping
  end

  class << self
    alias_method :now_without_warping, :now
    alias_method :now, :now_with_warping
  end

  def warp
    self.class.instance_variable_set('@warptime', self)
    yield
  ensure
    self.class.instance_variable_set('@warptime', nil)
  end
end
Hiermee kunnen we gemakkelijk terug naar “Unix Epoch”:

Time.at(0).warp do
  puts "The current time is: #{Time.now}" 
end
Of vlak voor het einde der tijden:

Time.at(2 ** 31 - 1).warp do
  Time.now + 1
end

Wat heb je er aan? Heel handig om tijds afhankelijke zaken te testen!

Geplaatst in ,  | 2 reacties

Reacties

  1. jeroen.houben@lostboys.nl zei 1 dag later:

    cool!

  2. Jeroen Knoops zei 3 dagen later:

    Wij gebruiken voor testing wat extra methods op Time.

    class Time
    @now = method(:now)
    def self.now=(time)
      @now = time
    end
    def self.now
      return @now.nil? ? @now.call : @now
    end
    end

    Nu kun je mooi in je testen je tijd zetten. Op de carnavals datum bijvoorbeeld.

    Time.now = Time.local(2007,11,11,11,11,11)

    Niet vergeten in de teardown de time weer terug te zetten.

    def teardown
      Time.now = nil
    end

    Mooi toch?

(Laat url/e-mail achter »)

   Voorvertoning