【问题标题】:simulate current date during tests在测试期间模拟当前日期
【发布时间】:2011-05-25 10:39:50
【问题描述】:

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

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

所以我需要在不同的时间点在不同的控制器中调用这个动作来测试我的分析组件是否进行了正确的计算,但是我没有找到在以下示例代码中实现 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

【问题讨论】:

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


    【解决方案1】:

    有很多宝石可以做这种事情。我最喜欢的是delorean:https://github.com/bebanjo/delorean

    【讨论】:

    • 会为回到未来的报价给予额外的荣誉,我喜欢使用这个宝石!
    【解决方案2】:

    进行此类测试的一种方法是模拟您要测试的方法/类。

    http://en.wikipedia.org/wiki/Mock_object

    这个想法是你可以创建一个相同的函数,除了传递一个日期而不是依赖于当前日期,然后测试它。困难在于确保这两个函数在其他方面确实是等效的,并保持对它们的任何更改同步。

    有一些现有的框架等用于模拟,但我对它们还不够熟悉,无法向您推荐一个。

    【讨论】:

      【解决方案3】:

      这个问题是不久前提出的,但现在有一个不需要额外的 gem 或安装的解决方案。

      time = 2.days.ago
      travel_to(time)
      

      来源:http://api.rubyonrails.org/v5.1/classes/ActiveSupport/Testing/TimeHelpers.html

      【讨论】:

        【解决方案4】:

        Rails 中有用于模拟时间的 gem。
        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
        

        【讨论】:

          【解决方案5】:

          这颗宝石看起来很有趣且维护良好:https://github.com/travisjeffery/timecop

          【讨论】:

            猜你喜欢
            • 2017-11-28
            • 1970-01-01
            • 2013-03-30
            • 1970-01-01
            • 2019-12-31
            • 2012-01-05
            • 1970-01-01
            • 2013-06-09
            • 1970-01-01
            相关资源
            最近更新 更多