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_time,to_datetime等等。我怎样才能通过测试?
旧但仍然有效...输出显示比较是针对 UTC 的,即 Time.current
这时候你可能会使用:
assert_in_delta object.sent_at, Time.current, 1
Run Code Online (Sandbox Code Playgroud)
容忍 <1 秒的差异
使用 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)
| 归档时间: |
|
| 查看次数: |
3380 次 |
| 最近记录: |