2014-02-28 26 views
3

我想在控制台中模拟Time.now返回给定的时间,比如说从现在开始的30分钟。这是在没有RSpec可用的临时服务器上。如何在没有Ruby测试库的情况下模拟时间?

以下没有工作,因为它创建了一个循环,提高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

回答

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 
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 

宝石的网站有更多的信息和例子。

相关问题