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?
Réponses
Trop de publicités?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"
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))
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