0

我已经安装了 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

如您所见,这些时间并不相等,原因是两者之间似乎存在 4/10000 秒的差异。我不知道这里发生了什么。我在 TimeCop 上做错了什么还是这是一个错误?

4

1 回答 1

1

这是如何Timecop#travel工作的,这是预期的行为

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

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

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

或者你可以像评论中已经提到的克里斯蒂安那样冻结时间。冻结时间意味着您将当前时间设置为特定时间并且它不会继续前进。例如像这样:

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
于 2021-10-28T07:44:27.587 回答