在测试期间模拟当前日期

时间:2010-12-14 17:40:01

标签: ruby-on-rails unit-testing testing time

我正在编写测试,我想知道在测试期间是否有办法更改当前日期?

重点在于我正在测试应用程序的统计功能,该功能连接到每次调用操作时创建实例的跟踪模型(仅通过“仅限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

5 个答案:

答案 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