在与TimeCop比较日期时获得秒差的小数部分,而不是相等的时间



我已经安装了TimeCop,并使用travel:选项与我的测试,但我的测试似乎是失败的,当我知道他们不应该。我认为这是我的代码,但似乎我得到的分数秒添加到某个地方,这导致日期应该等于不等于。

给定以下rspec测试:

it 'Testing TimeCop', travel: Time.new(2021, 10, 5, 9, 0, 0, '-07:00') do
puts "Time.now:                                              #{Time.now}"
puts "Time.new(2021, 10, 5, 9, 0, 0, '-07:00')}:             #{Time.new(2021, 10, 5, 9, 0, 0, '-07:00')}"
puts "Time.now == Time.new(2021, 10, 5, 9, 0, 0, '-07:00')}: #{Time.now == Time.new(2021, 10, 5, 9, 0, 0, '-07:00')}"
puts "Time.now -  Time.new(2021, 10, 5, 9, 0, 0, '-07:00')}: #{Time.now - Time.new(2021, 10, 5, 9, 0, 0, '-07:00')}"
end

我得到以下输出:

Time.now:                                              2021-10-05 09:00:00 -0700
Time.new(2021, 10, 5, 9, 0, 0, '-07:00')}:             2021-10-05 09:00:00 -0700
Time.now == Time.new(2021, 10, 5, 9, 0, 0, '-07:00')}: false
Time.now -  Time.new(2021, 10, 5, 9, 0, 0, '-07:00')}: 0.0004161418930646181

正如你所看到的,这些时间是不相等的,原因是两者之间似乎有1/10000秒的差异。我不知道这是怎么回事。是我在TimeCop上做错了什么,还是这是一个bug?

这就是Timecop#travel的工作方式,这是预期的行为。

设置旅行时间将时间设置为该时间戳,但允许时间继续移动。因为在测试中有多个Time.now调用,并且这些调用之间的时间移动,所以时间实例不可能相同。

这意味着您在测试中必须允许两个实例之间有微小的时间差异,例如:

expect(Time.now).to be_within(1.second).of Time.now

或者你可以像Christian在评论中提到的那样冻结时间。冻结时间意味着您将当前时间设置为特定时间,并且它不会继续移动。例如:

before do
Timecop.freeze(Time.new(2021, 10, 5, 9, 0, 0, '-07:00'))
end
after do
Timecop.return
end
it "Testing TimeCop" do
time = Time.new
pause 10
expect(time).to eq Time.now
end

最新更新