如何使此时间断言与时间、日期或日期时间完美匹配

Dan*_*bio 7 datetime ruby-on-rails minitest

我在测试中有一个断言,如下所示:

assert_equals object.sent_at, Time.now
Run Code Online (Sandbox Code Playgroud)

当我运行这个测试时,我不断收到一个看起来像这样的错误

--- expected +++ actual @@ -1 +1 @@ -Fri, 04 Mar 2016 18:57:47 UTC +00:00 +Fri, 04 Mar 2016

我已经尝试了一些组合来使这个测试通过。

我的实际代码sent_at用 a更新了值,Time.now但它的格式并不完美。它很近,但还不足以通过。我怎样才能让这个测试通过。

以下是我在断言中尝试过的一些组合:

Time.now.utc Date.today Time.now

和很多to_timeto_datetime等等。我怎样才能通过测试?

est*_*ani 9

旧但仍然有效...输出显示比较是针对 UTC 的,即 Time.current

这时候你可能会使用:

assert_in_delta object.sent_at, Time.current, 1
Run Code Online (Sandbox Code Playgroud)

容忍 <1 秒的差异


Gor*_*ndo 5

使用 Time#to_i 不是最好的解决方案。如果您正在运行的任务需要一秒钟以上,则比较将失败。即使您的任务足够快,这种比较也会失败:

time = Time.now # 2018-04-18 3:00:00.990
# after 20ms
assert_equal Time.now.to_i, time.to_i # Fails
Run Code Online (Sandbox Code Playgroud)

Time.now2018-04-18 3:00:01.010和 to_i 会给你2018-04-18 3:00:01,time was2018-04-18 3:00:00.990和 to_i: 2018-04-18 3:00:00。所以断言失败。因此,有时测试会通过而其他测试会失败,这取决于它何时(以毫秒为单位)开始。

更好的解决方案是冻结时间。您可以使用像Timecop这样的gem或编写自己的代码,例如(使用 MiniTest):

current_time = Time.now
# You need Mocha gem to use #stubs
Time.stubs(:now).returns(current_time)
Run Code Online (Sandbox Code Playgroud)

您也可以使用块,以便在块之后时钟恢复正常

# For this you don't need Mocha
Time.stub :now, current_time do   # stub goes away once the block is done
  assert your_task
end
Run Code Online (Sandbox Code Playgroud)