我想在控制台中模拟Time.now返回给定时间,比如说从现在起30分钟。这是在没有RSpec可用的登台服务器上。
以下操作无效,因为它会创建一个循环并引发SystemStackError:
t = Time.now + 30.minutes
t.to_s
=> "2014-02-28T17:33:37Z"
class Time
def self.now
iso8601 "2014-02-28T17:33:37Z"
end
end
Time.now
使用Ruby 1.9.3
答案 0 :(得分:2)
将时间设置为整数对我有用:
class Time
def self.now
Time.at(1393610063)
end
end
Time.now
#=> 2014-02-28 09:54:23 -0800
sleep 5
Time.now
#=> 2014-02-28 09:54:23 -0800
答案 1 :(得分:0)
Timecop gem是为了这个目的而设计的。虽然它旨在简化测试,但它并不是一个测试框架。 - 它不需要rspec或rails,可以在任何ruby项目中使用。
freeze
方法允许您静态模拟当前时间:
# Assume it is currently 12:00:00 on 3/1/2015
Timecop.freeze( Time.now + 30.minutes ) do
puts Time.now # --> shows 12:30:00
do_something_for_fifteen_seconds
puts Time.now # --> still shows 12:30:00; time has not passed
end
travel
方法允许您动态模拟当前时间:
Timecop.travel( Time.now + 30.minutes ) do
puts Time.now # --> shows 12:30:00
do_something_for_fifteen_seconds
puts Time.now # --> shows 12:30:15; time has passed but we are still 30 minutes ahead of reality
end
scale
方法允许你比现实更快(或更慢)地模拟时间的流逝:
Timecop.scale( 60 ) do
puts Time.now # --> shows 12:00:00
do_something_for_fifteen_seconds
puts Time.now # --> shows 12:15:00; time has passed 60 times faster,
# so 15 seconds of real time appears as 15 minutes
end
宝石网站上有更多信息和示例。