覆盖Ruby认为Time.now中的当前时间?

Lan*_*ard 4 ruby ruby-on-rails

我想为应用程序创建测试数据,并且有很多time_at属性被跟踪,太多而无法以可维护的方式覆盖.我在想的是,我可以在Ruby中更改基准参考时间变量吗?

这将使得它如此created_at,updated_at,last_login_at,等,可以设置为人工时间,所以我可以在测试中做到这一点:

Date.today #=> Thu, 30 Dec 2010
Time.system_time_offset = 1.week.ago # made up
Date.today #=> Thu, 23 Dec 2010
Time.now   #=> Thu Dec 23 14:08:38 -0600 2010

user_1 = User.create!
user_1.created_at #=> Thu Dec 23 14:08:38 -0600 2010

Time.reset_system_time # made up

user_2 = User.create!
user_1.created_at #=> Thu Dec 30 14:08:38 -0600 2010
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

Pan*_*kos 7

您可以使用Mocha在测试期间更改Time.now的返回值:

Time.stubs(:now).returns(Time.now - 1.day)


Nat*_*375 5

Timecop就是一个很好的选择:https : //github.com/travisjeffery/timecop
您可以非常轻松地冻结时间或更改时间(持续进行时间)。

例如

Time.now
# => 2014-03-14 13:17:02 -0400
Timecop.travel 2.hours.ago
Time.now
# => 2014-03-14 11:17:04 -0400
Run Code Online (Sandbox Code Playgroud)

它比mocha解决方案更好,因为所有时间功能都将受到同等的影响,因此您将无法测试Time.now返回的内容是否不同于DateTime.now。

它也比另一个答案中建议的时间扭曲的宝石更新。