如何用RSpec比较日期?毫秒不一致致断言失败
解决RSpec中DateTime比较的毫秒不一致问题
我创建了变量@now存储类似'2023-01-04T14:30:00-04:00'的时间值,但测试时发现实际存储的时间和@now不一致,推测是毫秒重计算导致的。
测试代码如下:
it 'ok' do @now = DateTime.now payload = { start: @now } put "/api/v1/#{@id}", params: payload expect(@element.start).to eq(@now) end
运行后出现如下错误:
Diff: @@ -1 +1 @@ -Wed, 04 Jan 2023 15:23:39 +0000 +Wed, 04 Jan 2023 15:23:38.324000000 UTC +00:00
解决方法
截断毫秒精度:生成
@now时直接去掉微秒部分,确保时间精确到秒:@now = DateTime.now.change(usec: 0)这样存储后的时间不会包含毫秒,和
@now直接用eq比较就能匹配。使用误差允许的匹配器:如果业务允许毫秒级误差,用RSpec的
be_within匹配器:expect(@element.start).to be_within(1.second).of(@now)该匹配器会允许两个时间在1秒范围内的差异,兼容毫秒级的计算误差。
统一数据库时间精度:检查数据库的时间字段设置,将其精度调整为秒级(而非毫秒级),这样存储时会自动截断毫秒,从根源避免精度不一致问题。
内容的提问来源于stack exchange,提问作者le za a
相关产品推荐
相关产品推荐

