ruby-on-rails - 运行 Rails 测试时如何覆盖 Date.today?

标签 ruby-on-rails ruby rake

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

有没有一种方法可以使用覆盖系统时钟的 ENV 变量来运行 rake 测试?这样调用 Date.todayTime.now1.day.ago1.day.from_now 会使用我设置的日期吗?

例如:

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

最佳答案

对于测试,您可以使用timecop gem 。 它为您提供了两种有用的方法 Timecop.freezeTimecop.travel

例如,你可以使用freezebefore 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/

相关文章:

ruby-on-rails - CORS 预检选项请求是否应该返回 200 OK?

javascript - 在循环 coffeescript 中循环

ruby-on-rails - ApplicationController :Class 的路由错误未定义局部变量或方法 `with'

ruby-on-rails - Netbeans/Ruby - 无关(?)自动完成信息

ruby-on-rails - 显示时从表中删除记录

ruby-on-rails - rake 规范中的 `uninitialized constant Rake`

mysql - 如何在 Rails 中预先填充的数据库上运行测试?

sql - Postgresql在不同服务器上的不同查询计划

ruby - capybara :从加载的页面保存图像(不是屏幕截图)

ruby - 如何获取当前rake任务的PID?