Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有Ruby测试库的情况下模拟时间?_Ruby - Fatal编程技术网

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

如何在没有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中

我想在控制台中模拟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中工作

将时间设置为整数对我来说很有用:

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
创业板的网站上有更多的信息和例子