【问题标题】:Temporarily setting system time with Ruby for unit testing使用 Ruby 临时设置系统时间以进行单元测试
【发布时间】:2012-08-01 13:24:51
【问题描述】:

我在 Apt 模型上创建了一个自定义验证,用于验证如果表单提交是在下午 3 点之后完成,则无法预订第二天的约会,我正在尝试确定运行单元测试以验证我的自定义验证是否正常工作。

目前,我的测试包含一个 if 语句,用于检查测试是在下午 3 点之前还是之后运行,并根据当前系统时间使用不同的测试。但是,无论系统时间是多少,我都希望能够测试这两种情况。

test "booking appointment for tomorrow before/after three pm" do
  a = appointments(:aptone)

  # Set appointment date to tomorrow
  a.apt_date = DateTime.current + 1.day

  if (Time.current.hour >= 12)
    assert(a.invalid?, 'Appointment CANNOT be booked after 3 PM')
  elsif
    assert(a.valid?, 'Appointment CAN be booked before 3 PM')
  end
end

我想知道是否有办法在运行测试时临时设置系统时间,这样无论何时运行测试,我都可以测试两个断言。

【问题讨论】:

    标签: ruby-on-rails unit-testing validation mocking ruby-on-rails-3.2


    【解决方案1】:

    我强烈推荐timecop gem,它完全符合您提到的要求。查看 github 页面上的文档,特别是 freeze 方法(或 travel,但最好在您的示例中针对冻结的系统时间进行测试)。

    【讨论】:

    • 您可能还想考虑让您的测试(和应用程序!)时区感知。您当前的测试似乎很容易通过在另一个时区执行而被破坏。
    • timecop gem 是我基于时间的测试的完美解决方案。谢谢!我在 environment.rb 文件中指定了时区。我不确定在另一个时区运行时是否需要做更多工作以防止它成为问题。
    【解决方案2】:

    更简单的方法是使用模拟框架来存根来自DateTime.current 调用的响应以返回您的硬编码值。

    这样可以避免弄乱您的系统时钟。

    【讨论】:

      【解决方案3】:

      系统时间与您的操作系统有关,与您的应用程序无关。因此,如果您想设置它,那么您可以使用 日期 --set="STRING" 在 Linux 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-05
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多