我在rails 3测试套件中进行了一个测试,它生成了一些断言,比较在本地计算机上传递但在ci管道中失败的时间戳。此测试将时间戳以6的精度存储在Postgres数据库时间戳字段中,并将存储的值与原始时间戳进行比较,非常类似于以下示例:
tmp_time = Time.zone.now
u = User.find(1)
u.updated_at = tmp_time
u.save!
u.reload
assert_equal u.updated_at.to_i, tmp_time.to_i # passes...
assert_equal u.updated_at, tmp_time # fails...
assert_equal u.updated_at.to_f, tmp_time.to_f # fails...
我认为这个问题与ruby的时间表示比存储值的精度更高有关。
除了在比较中不那么精确外,什么是补偿由于精度而导致的数值微小差异的最佳方法?我们已经考虑过超越时区,但相信这会导致下游问题。
提前谢谢。
最佳答案
我建议用[timecop][1]来做这种测试。我还要补充一点,手动触摸时间戳是不好的做法,所以我甚至不确定您测试的是什么。听起来你不相信时间戳。但如果你必须,这里:
Timecop.freeze
tmp_time = Time.zone.now
u = User.find(1)
u.updated_at = tmp_time
u.save!
u.reload
#your tests should pass now
如果他们没有,[见核心轨道上的这个开放问题][2]。
如果这和你的问题有关,时间警察应该阻止它发生。但如果没有,那么恭喜你,你已经找到了一个核心rails边缘的案例。
关于ruby-on-rails - Ruby Time.zone.now并考虑数据库精度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54994592/