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」 進行設置。

相關問題