如何在没有Ruby测试库的情况下模拟时间?
我想在控制台中模拟Time.now来返回给定的时间,比如说30分钟后。这在没有可用RSpec的临时服务器上 以下操作不起作用,因为它会创建循环并引发SystemStackError:如何在没有Ruby测试库的情况下模拟时间?,ruby,Ruby,我想在控制台中模拟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中
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中工作将时间设置为整数对我来说很有用:
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
这台机器正是为这个目的而设计的。尽管它的设计目的是使测试变得简单,但它不是一个“测试框架”——它不需要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
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
travel
方法允许您动态模拟当前时间:
# 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
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
创业板的网站上有更多的信息和例子