您也许可以将其timecop
用作解决方案的一部分(这对我来说也是“有史以来最好的宝石”)。它使用简单,并且可以同步修补大多数时间数据源,因此,例如,如果您的Utils
模块使用标准方法来评估时间,它应该具有与所示相同的“现在”概念Time.now
。
请注意,如果在另一个进程上调用外部 API,这将不起作用Utils
,在这种情况下,您应该将其存根以返回测试断言中所需的正常运行时间值。
以下rspec
片段作为示例,并对您可用的内容进行了一些假设(例如正在调用的被测模块Server
)
describe "#should_restart?"
before :each do
Timecop.travel( Time.parse("2013-08-01T12:00:00") )
Server.start # Just a guess
# Using `mocha` gem here
Konfig.expect(:get).with(:auto_restart_time).returns( "18:00:00" )
end
after :each do
Timecop.return
end
it "should be false if the server has just been started" do
Server.should_restart?.should be_false
end
it "should be false before cutoff time" do
Timecop.travel( Time.parse("2013-08-02T16:00:00") )
Server.should_restart?.should be_false
end
it "should be true when the server has been up for a while, after cutoff time" do
Timecop.travel( Time.parse("2013-08-02T18:05:00") )
Server.should_restart?.should be_true
end
end