3

我已经在Apt模型上创建了一个自定义验证,验证如果表单提交是在下午3点之后完成的,则无法为第二天预约约会,试图确定运行单元测试以验证我的自定义验证工作正常的最佳方式。使用Ruby临时设置系统时间以进行单元测试

目前,我的测试包含一个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 

我想知道是否有一种方法可以临时设置系统时间运行测试一段时间,所以我可以测试断言,无论当测试跑的。

回答

6

我可以强烈推荐timecop gem,这是为您提到的要求而写的。看一下github页面上的文档,特别是freeze方法(或者travel,但是在你的例子中,最好测试一下冻结的系统时间)。

+0

您可能还想考虑让您的测试(和应用程序!)时区感知。看起来你现在的测试很容易就可以通过在另一个时区执行来破解。 – emrass 2012-08-03 13:42:50

+0

timecop宝石是我基于时间的测试的完美解决方案。谢谢! 我已经在environment.rb文件中指定了时区。我不确定是否需要采取更多措施,以防止在另一时区运行时出现问题。 – dspencer 2012-08-03 17:11:49

5

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

这样可以避免搞乱系统时钟。

0

系统时间与您的操作系统有关,而与您的应用程序无关。所以如果你想设置它,那么你可以在Linux中使用 date --set =“STRING” 进行设置。

相关问题