比较时间忽略第二部分的最后3位数

时间:2015-01-06 16:01:52

标签: ruby

我有测试确保时间戳不会改变。它们通过我的本地环境但在构建上失败。它与“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位数?是否有时间函数只是比较时间,比如分数的几百个位置?

感谢。

2 个答案:

答案 0 :(得分:1)

Ruby的精度比数据库更高(在我的情况下为PostgreSQL)。

从数据库中读取值后,该值将保留为小数点后的更少位数。

有两种解决方法:

  1. 使用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)
    
  2. 使用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)
    

答案 1 :(得分:0)

使用浮点数时,通常应使用be_within匹配器:https://www.relishapp.com/rspec/rspec-expectations/v/2-5/docs/built-in-matchers/be-within-matcher

这样,您可以定义要比较值的精度:

expect(updated_at).to be_within(0.000001).of(timestamp)