Ruby on rails 在测试期间模拟当前日期
我正在写测试,我想知道是否有办法在测试期间更改当前日期 关键是我正在测试应用程序的统计功能,该应用程序连接到一个跟踪模型,该模型在每次调用动作时创建一个实例(通过“before_filter only”调用只跟踪一些动作) 因此,我需要在不同的时间点在不同的控制器中调用此操作,以测试我的分析组件是否进行了正确的计算,但在以下示例代码中,我没有找到任何实现更改当前时间的方法:Ruby on rails 在测试期间模拟当前日期,ruby-on-rails,unit-testing,testing,time,Ruby On Rails,Unit Testing,Testing,Time,我正在写测试,我想知道是否有办法在测试期间更改当前日期 关键是我正在测试应用程序的统计功能,该应用程序连接到一个跟踪模型,该模型在每次调用动作时创建一个实例(通过“before_filter only”调用只跟踪一些动作) 因此,我需要在不同的时间点在不同的控制器中调用此操作,以测试我的分析组件是否进行了正确的计算,但在以下示例代码中,我没有找到任何实现更改当前时间的方法: test "login count" do change_current_time(2.day.ago) get
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
进行此类测试的一种方法是模拟要测试的方法/类 其思想是您可以创建一个相同的函数,除了传入一个日期而不是依赖当前日期,然后测试它。困难在于确保这两个函数在其他方面是等效的,并保持对它们的任何更改同步
现有的框架和类似的框架都可以用来模拟,但我对它们还不太熟悉,不足以向您推荐一个。做这类事情有很多诀窍。我最喜欢的是德洛林:在Rails中,有一块可以用来嘲弄时间的宝石。
这个gem看起来很有趣并且维护得很好:这个问题是前一段时间提出的,但是现在有一个解决方案,不需要额外的gem或安装
time = 2.days.ago
travel_to(time)
资料来源:如果引用《回到未来,我喜欢使用这颗宝石》,我会给予额外的赞誉!
time = 2.days.ago
travel_to(time)