【发布时间】:2019-07-26 10:27:07
【问题描述】:
我在 Rails 3 测试套件中进行了一个测试,该测试生成了一个数字断言,这些断言比较了在我的本地机器上通过但在我们的 CI 管道中失败的时间戳。该测试在 Postgres 数据库时间戳字段中存储一个时间戳,精度为 6,并将存储的值与原始时间戳进行比较,非常类似于以下示例:
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 的时间表示比存储的值具有更高的精度有关。
除了在比较中不太精确之外,补偿由于精度引起的值的细微差异的最佳方法是什么?我们考虑过覆盖 Time.zone.now,但相信这会导致下游问题。
提前致谢。
【问题讨论】:
-
这个测试首先可能有什么用处?好像你不信任时间戳。
-
你能在 CI 管道中输出
u.updated_at.to_f和tmp_time.to_f的值吗? -
“在我的本地机器上通过,但在我们的 CI 管道中失败” – 如果这是由于 Postgres,你应该在本地机器上遇到同样的问题。或者您是否在本地和您的 CI 上运行不同的 Postgres 版本/数据库模式?
标签: ruby-on-rails ruby postgresql