我有一些测试在特定日期失败,因为有人编写它们以使用 Date.today
。我想重现之前选定日期的失败。
有没有一种方法可以使用覆盖系统时钟的 ENV 变量来运行 rake 测试?这样调用 Date.today
、Time.now
、1.day.ago
和 1.day.from_now
会使用我设置的日期吗?
例如:
> DATE_TODAY='2017-01-04' rake test
最佳答案
对于测试,您可以使用timecop gem 。
它为您提供了两种有用的方法 Timecop.freeze
和 Timecop.travel
。
例如,你可以使用freeze
在before hooks中静态设置时间:
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
或者在 block 中:
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
关于ruby-on-rails - 运行 Rails 测试时如何覆盖 Date.today?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41465624/