72 votes

Comment faux du Temps.maintenant?

Quelle est la meilleure façon de mettre en Time.now pour la fin du temps d'essai-méthodes sensibles dans un test unitaire?

77voto

James A. Rosen Points 25774

J'aime vraiment le Timecop de la bibliothèque. Vous pouvez le faire de temps se déforme sous forme de bloc (comme time-warp):

Timecop.travel(6.days.ago) do
  @model = TimeSensitiveMode.new
end
assert @model.times_up!

(Oui, vous pouvez imbriquer des blocs-forme de voyage dans le temps.)

Vous pouvez également faire déclarative voyage dans le temps:

class MyTest < Test::Unit::TestCase
  def setup
    Timecop.travel(...)
  end
  def teardown
    Timecop.return
  end
end

J'ai quelques concombre aides pour Timecop ici. Ils vous permettent de faire des choses comme:

Given it is currently January 24, 2008
And I go to the new post page
And I fill in "title" with "An old post"
And I fill in "body" with "..."
And I press "Submit"
And we jump in our Delorean and return to the present
When I go to the home page
I should not see "An old post"

45voto

Avdi Points 13086

Personnellement, je préfère faire de l'horloge injectable, comme suit:

def hello(clock=Time)
  puts "the time is now: #{clock.now}"
end

Ou:

class MyClass
  attr_writer :clock

  def initialize
    @clock = Time
  end

  def hello
    puts "the time is now: #{@clock.now}"
  end
end

Cependant, nombreux sont ceux qui préfèrent utiliser un moqueur/stubbing de la bibliothèque. Dans RSpec/flexmock vous pouvez utiliser:

Time.stub!(:now).and_return(Time.mktime(1970,1,1))

Ou Moka:

Time.stubs(:now).returns(Time.mktime(1970,1,1))

14voto

Staelen Points 4666

Je suis l'aide de RSpec et je l'ai fait: le Temps.stub!(:maintenant).and_return(2.jours.il ya) avant que j'appelle le Temps.maintenant. Dans ce sens, je suis capable de contrôler le temps que je l'ai utilisé que pour les cas de test

10voto

BaroqueBobcat Points 6788

Faire le time-warp

time-warp est une bibliothèque qui fait ce que vous voulez. Il vous donne une méthode qui prend un temps et un bloc et tout ce qui se passe dans le bloc utilise la faux du temps.

pretend_now_is(2000,"jan",1,0) do
  Time.now
end

7voto

Andrew Grimm Points 22996

N'oubliez pas que l' Time est simplement une constante qui se réfère à un objet de classe. Si vous êtes prêt à provoquer un avertissement, vous pouvez toujours le faire

real_time_class = Time
Time = FakeTimeClass
# run test
Time = real_time_class

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X