2013-04-12 31 views
13

我正在努力讓rails 3應用程序準備好使用時區。我的開發機器在EDT,我託管的服務器使用UTC。在我的rspec測試中有沒有辦法改變ruby使用的系統時區,這樣我就可以使用相同的系統時區運行測試,而無需更改計算機上的系統時鐘?我考慮過Delorean和Timecop,他們不是我要找的。我正在尋找像在不改變系統時鐘的情況下在rspec測試中設置系統時間

Time.system_time_zone = "UTC" 

...然後Time.now將返回UTC時間,而不是我的系統時區設置爲。

回答

10
before {Time.stub(:now) {Time.now.utc}} 

有了這個,隨時隨地Time.now被稱爲在測試中,它會返回系統的時間,UTC。

例子:

describe Time do 
    before {Time.stub(:now) {Time.now.utc}} 

    it "returns utc as my system's time" do 
    Time.now.utc?.should be_true 
    end 
end 
+1

謝謝查爾斯,我希望有一個更全面的設置,但這正是我所需要的。 –

+0

這將是一件很好的事情...... –

+1

@JoshuaMuheim我相信[TimeCop](https://github.com/travisjeffery/timecop)寶石會這樣做。 –

-1

Rails的給你正是你在找什麼:

Time.zone = "UTC" 

http://api.rubyonrails.org/classes/Time.html#method-c-zone-3D以獲取更多信息。

+1

這並不做什麼,我是問。這告訴軌道,當你通過Time.zone將事物放入由Time.zone指定的時區時。當你使用Time.now時,我希望有時間以UTC返回。 –

+0

對,你需要調用'Time.zone.now'或'Time.current'而不是'Time.now' – CubaLibre

+0

正確,但我的問題的整個想法是將我的測試中的系統時間設置爲UTC。你的解決方案是通過'Time.zone'告訴rails將所有時間轉換爲UTC。做'時間。現在'仍然會在系統指定的時區給你時間。 Charles的解決方案就是這樣做的。 –