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