【问题标题】:Getting fractions of seconds difference instead of equal times when comparing dates with TimeCop使用 TimeCop 比较日期时,获得几分之一秒的差异而不是相等的时间
【发布时间】:2021-12-13 05:51:39
【问题描述】:

我已经安装了 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 上做错了什么还是这是一个错误?

【问题讨论】:

  • 你试过它与Timecop.freeze(Time.new(2021, 10, 5, 9, 0, 0, '-07:00')) { }一起工作吗?可能没有正确设置 RSpec 集成?
  • @ChristianBruckmayer 我在尝试执行此操作时遇到 Unitialized Constant 错误。 travel: 有效,所以 TimeCop 正在做某事,但我的测试显然不知道 TimeCop,所以我需要按照你说的正确设置它。任何想法都会有所帮助。另外,请像 spickerman 一样提交一个答案,当我最终弄清楚这一点时,我会给你 +1。

标签: ruby-on-rails ruby rspec timecop


【解决方案1】:

这就是Timecop#travel 的工作方式,它就是expected behavior

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

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

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

或者您可以像在 cmets 中提到的 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

【讨论】:

  • 在我昨天做了一些研究之后(感谢 Christian),我感觉 Time.now 就是这种情况。但是,我昨天在结束这一天之前确实尝试了这个,并在 TimeCop 上遇到了 Uninit Const 错误,这似乎很奇怪,因为 travel: some_time 有效。我会继续努力。我确定这个答案是正确的,但我会尝试找出为什么我的测试不知道TimeCop
猜你喜欢
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 2017-04-26
  • 2016-02-11
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多