我有一些测试在特定日期失败,因为有人写了它们以使用Date.today
。我想在之前的选择日期重现失败。
有没有办法用一个覆盖系统时钟的ENV变量运行rake测试?那么对Date.today
,Time.now
以及1.day.ago
和1.day.from_now
的调用是否会使用我设置的日期?
喜欢,例如:
> DATE_TODAY='2017-01-04' rake test
答案 0 :(得分:6)
对于测试,您可以使用timecop gem。
它为您提供了两种有用的方法Timecop.freeze
和Timecop.travel
。
例如,您可以使用freeze
在挂钩之前静态设置时间:
describe 'your tests' do
before do
Timecop.freeze(Time.new(2017, 1, 4))
end
after do
Timecop.return
end
it 'should do something' do
sleep(10)
Time.now # => 2017-01-04 00:00:00
end
end
或阻止:
Timecop.freeze(Time.now - 3.months) do
assert product.expired?
end
使用travel
方法时,您可以更改开始时刻,但时间仍然在经过。
Timecop.travel(Time.new(2017, 1, 4))
sleep(10)
Time.now # => 2017-01-04 00:00:10
答案 1 :(得分:3)
Rails 5现在融入了Timecop和Delorean的许多功能。 Delorean你可以做的地方:
Delorean.time_travel_to("January 1st 1999") do...
您现在可以
travel_to Time.new(2004, 11, 24, 01, 04, 44)
完整的API文档位于:http://api.rubyonrails.org/classes/ActiveSupport/Testing/TimeHelpers.html