【问题标题】:Changing of difference between created_at and frozen Time.now after reloading of object重新加载对象后更改 created_at 和 freeze Time.now 之间的差异
【发布时间】:2015-05-22 20:31:55
【问题描述】:

我有检查 Time.now 和对象的 created_at 属性之间差异的计算的规范。我存根 Time.now,所以这个值是恒定的。此外,我将 Time.now 设置为 created_at,但在重新加载对象后,此值会发生变化。这怎么可能?如何在对象重新加载后冻结 created_at?

这是一个问题的例子:

time = Time.now
=> 2015-03-19 15:50:13 UTC
Time.stubs :now => time
=> #<Expectation:0x9938830 allowed any number of times...
user = User.last
=> #<User:0x000000097a6e40...
user.update_attribute :created_at, Time.now - 1.minute
=> true
user.created_at
=> Thu, 19 Mar 2015 15:49:13 UTC +00:00
Time.now - user.created_at
=> 60.0
Time.now - user.reload.created_at
=> 60.442063277

我使用 rails 4.2.0、ruby 2.2.0 和 rspec 2.14.1

【问题讨论】:

  • 证明Time.now 没有变化,而created_at 正在变化。你没有证明这一点,只是做了假设。在您的脚本中执行 puts Time.nowuser.reload.created_at
  • 不幸的是,这是一种常见的情况——它与存根时间无关——实际上是 created_at 的值发生了变化。数据库不存储毫秒,因此重新加载后此信息会丢失。不幸的是,我还没有看到解决这个问题的好方法。
  • 我都得到了 60.0——使用 rails 4.2.0、ruby 2.2.0 和 rspec 2.14.1,我得到了 Time.stubs 的错误,所以你的输出有些可疑。

标签: ruby-on-rails ruby rspec rspec2


【解决方案1】:

只需重置纳秒:

time = Time.now.change(nsec: 0)

或毫秒:

time = Time.now.change(usec: 0)

Here 详细信息。

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 2014-03-03
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多