gpt4 book ai didi

ruby-on-rails - 比较时间忽略第二个小数的最后 3 位数字

转载 作者:行者123 更新时间:2023-12-04 18:05:24 25 4
gpt4 key购买 nike

我有确保时间戳不会改变的测试。它们在我的本地环境中通过,但在构建时失败。它与为“updated_at”返回的值有关,即将第二个分数的最后 3 位数字更改为 0。这是失败的示例:

RSpec::Expectations::ExpectationNotMetError: 
expected: 2015-01-06 10:16:29.948655841 -0500
got: 2015-01-06 10:16:29.948655000 -0500

RSpec::Expectations::ExpectationNotMetError:
expected: 2015-01-06 10:16:31.236196108 -0500
got: 2015-01-06 10:16:31.236196000 -0500

如何建立断言以忽略最后 3 位数字?是否有一个时间函数可以比较时间,比如分数的百位?

谢谢。

最佳答案

Ruby 保持比数据库更高的精度(在我的例子中是 PostgreSQL)。

当从数据库中读回该值时,它会保留为小数点后较少的数字。

有两种方法可以解决这个问题:

  • 使用 to_i转换为 UNIX 时间。
    expect(user.updated_at.to_i).to eq(new_updated_at.to_i)

    为了进一步帮助,您可以在 spec/spec_helper.rb 中创建一个助手。
     # https://stackoverflow.com/a/61312010/1177636
    RSpec::Matchers.define :eq_time do |expected|
    match do |actual|
    expected.to_i == actual.to_i
    end
    end

    然后将其用作
    expect(user.updated_at).to eq_time(new_updated_at)
  • 使用 RSpec 的 be_within匹配器。

    https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/be-within-matcher
    expect(user.updated_at).to be_within(0.001.seconds).of(new_updated_at)
  • 关于ruby-on-rails - 比较时间忽略第二个小数的最后 3 位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27802392/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com