在测试ruby方法的时候,有些方法中会调用Time.now
这个时间不是我们能控制的时间,但是它的返回值对方法的执行有着影响
那么有没有办法让Time.now返回一个我们期望的值呢?这样测试起来就太方便了
这是就可以用到 https://github.com/bebanjo/delorean 了
具体的用法请参考README,这里打算研究一下它是怎么实现这个功能的
它的代码不多只有不到100行,可以一步步分析
核心代码:
class << Timealias_method :now_without_delorean , :nowdef now ; Delorean . now ; endend
通过 alias_method 将原先方法名now 替换成了 now_without_delorean
这样我们就可以重新定义Time.now的方法
这里Time.now就使用了Delorean.now
下面在看一下Delorean.now是如何实现的
def nowTime . now_without_delorean - time_travel_offsets . inject ( 0 ){ | sum , val | sum + val }end
这里的 time_travel_offsets 是Delorean的类变量,使用前通过 Delorean.time_travel_to(time)这个方法,Delorean会在类变量time_travel_offsets中记录时间需要漫游多少秒
当调用Delorean.now的时候 ,它就用Time.now_without_delorean减去time_travel_offsets作为返回值,最终达到可以随意设定Time.now返回值的功能
注意:目前这个Delorean不支持多线程