如何在没有Ruby测试库的情况下模拟Time?

时间:2014-02-28 17:40:03

标签: 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

2 个答案:

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

宝石网站上有更多信息和示例。