我正在编写测试,我想知道在测试期间是否有办法更改当前日期?
重点在于我正在测试应用程序的统计功能,该功能连接到每次调用操作时创建实例的跟踪模型(仅通过“仅限prefilter”调用跟踪某些操作)< / p>
所以我需要在不同的时间点在不同的控制器中调用此操作来测试我的分析组件正在进行正确的计算,但我没有找到任何方法在以下示例代码中实现change_current_time:
test "login count" do
change_current_time(2.day.ago)
get "users/login/testuser/testpassword"
assert login_count(2.day.ago) == 1
change_current_time(1.day.ago)
get "users/login/testuser/testpassword"
get "users/login/testuser1/testpassword1"
assert login_count(1.day.ago) == 2
end
答案 0 :(得分:5)
有很多宝石可以做这种事情。我最喜欢的是delorean:https://github.com/bebanjo/delorean
答案 1 :(得分:1)
进行此类测试的一种方法是模拟您要测试的方法/类。
http://en.wikipedia.org/wiki/Mock_object
这个想法是你可以创建一个相同的函数,除了传递一个日期而不是依赖于当前日期,并测试它。困难来自于确保两个函数真正等效并保持对它们的任何更改同步。
现有的框架和其他用于嘲笑的框架,但我对他们不太熟悉,不推荐给你一个。
答案 2 :(得分:1)
这个问题刚才问过,但现在有一个解决方案,不需要额外的宝石或安装。
pickle
来源:http://api.rubyonrails.org/v5.1/classes/ActiveSupport/Testing/TimeHelpers.html
答案 3 :(得分:0)
在Rails中有嘲笑时间的宝石。
https://github.com/harvesthq/time-warp
time = (2.days.ago)
pretend_now_is(time) do
get "users/login/testuser/testpassword"
assert login_count(Date.today) == 1 # it's stubbed
end
time = (1.days.ago)
pretend_now_is(time) do
get "users/login/testuser/testpassword"
get "users/login/testuser1/testpassword1"
assert login_count(Date.today) == 2
end
答案 4 :(得分:0)
这个宝石看起来很有趣且维护得很好:https://github.com/travisjeffery/timecop