【问题标题】:How do I correctly freeze time w/ Timecop in my spec?如何在我的规范中正确冻结时间与 Timecop?
【发布时间】:2011-07-27 02:01:23
【问题描述】:

我正在尝试结合使用 Timecop 并将 arel where_sql 查询到数据,但我似乎无法让 Timecop 真正冻结时间。我已经尝试过 Timecop.freeze 和 Timecop.freeze(Time.now),在我的规范中使用 Time.now 时,两者都略有偏差。

我错过了什么? Ruby 1.9.2、Rails 3.1.0.rc5

--

错误

Failure/Error: Game.unreleased.arel.where_sql.should eq("WHERE (release_date > '#{Time.now}')")


     expected "WHERE (release_date > '0000-01-01 00:00:00 -0500')"
     got "WHERE (release_date > '0000-01-01 05:00:00.000000')"

型号

scope :unreleased, lambda { |limit = 4| where('release_date > ?', Time.now).
                                        order('release_date asc').
                                        limit(limit) }

规格

it "should retrieve games with a release date later than today" do
  Timecop.freeze
  Game.unreleased.arel.where_sql.should eq("WHERE (release_date > '#{Time.now}')")
end

【问题讨论】:

  • 仔细观察,我认为这不是 timecop,而是时间戳格式的问题。现在只是想办法解决这个问题。

标签: ruby-on-rails ruby-on-rails-3 testing rspec


【解决方案1】:

我在规范中对 timecop 的使用总是如下所示:

Timecop.travel(Time.zone.local(2010, 6, 1, 13, 0, 0)) do
  .. time sensitive spec here ..
end

在 Rails 应用程序中处理时间时,使用 Time.zone 代理(Time.zone.now、Time.zone.utc、Time.zone.local 等)通常也是一种很好的做法。

【讨论】:

  • 显示 where 子句中使用的正确时间戳格式仍然存在问题,但您的 Timecop 答案是正确的。
【解决方案2】:

我在运行时使用 RSpec 的 expect 语法运行 Timecop 时遇到问题:

it "updates :completed_at" do
  Timecop.freeze
  expect(@task.completed_at).to eq(Time.zone.now)
end

时间不匹配的地方。为了解决,我将Timecop.freeze 放在before 子句中。

(我意识到这个问题比较老,并且 RSpec 的 expect 语法并不存在,但我认为将 Timecop.freeze 添加到 before 块或子句可能会帮助遇到原始问题中提到的相同问题的人。当然,提出一个新问题并回答它似乎并不值得,因为我的问题与上面的问题非常相似。)

【讨论】:

    【解决方案3】:

    前往日期并包括 TimeHelpers,例如:

    include ActiveSupport::Testing::TimeHelpers
    
    let!(:archived_date) { Time.zone.now }
    
    travel_to(archived_date) do
      expect(OrderService.getOrder(some_old_order).archived_at).to eq Time.zone.now
    end
    

    【讨论】:

    • 您的观点很好,但您并没有直接回答问题;因此,您应该更加明确:您使用Timecop,而是使用Rails Helper Method (travel_to),并且此方法(以及其他方法)从Rails 4.1 开始可用.
    猜你喜欢
    • 2021-08-25
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多