Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在测试期间模拟当前日期_Ruby On Rails_Unit Testing_Testing_Time - Fatal编程技术网

Ruby on rails 在测试期间模拟当前日期

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

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

关键是我正在测试应用程序的统计功能,该应用程序连接到一个跟踪模型,该模型在每次调用动作时创建一个实例(通过“before_filter only”调用只跟踪一些动作)

因此,我需要在不同的时间点在不同的控制器中调用此操作,以测试我的分析组件是否进行了正确的计算,但在以下示例代码中,我没有找到任何实现更改当前时间的方法:

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)