如何在运行rails测试时覆盖Date.today?

时间:2017-01-04 13:59:26

标签: ruby-on-rails ruby rake

我有一些测试在特定日期失败,因为有人写了它们以使用Date.today。我想在之前的选择日期重现失败。

有没有办法用一个覆盖系统时钟的ENV变量运行rake测试?那么对Date.todayTime.now以及1.day.ago1.day.from_now的调用是否会使用我设置的日期?

喜欢,例如:

> DATE_TODAY='2017-01-04' rake test

2 个答案:

答案 0 :(得分:6)

对于测试,您可以使用timecop gem。 它为您提供了两种有用的方法Timecop.freezeTimecop.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