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