2012-02-19 32 views
3

在rspec中,我們希望檢查發票控制器中的更新是否更新了日期字段。下面是代碼:爲什麼rspec在rails 3.1.0中有一天的差異?

it "should have corp head id and approve date" do 
    cust = Factory(:customer) 
    u = Factory(:user) 
    rfq = Factory(:rfq, :sales_id => u.id, :customer_id => cust.id, :sales_id => u.id) 
    q = Factory(:quote, :rfq_id => rfq.id) 
    i = Factory(:invoice, :quote_id => q.id, :approved_by_corp_head => nil)  
    session[:corp_head] = true 
    session[:user_id] = u.id  
    get 'update', :id => i.id, :quote_id => q.id, :invoice => {:paid_out => true, :approved_by_corp_head => true} 
    i.reload.corp_head_id.should == u.id 
    i.reload.approve_date_corp_head.strftime("%Y/%m/%d").should == Time.now.strftime("%Y/%m/%d") 
end 

在發票控制器,有一行記錄Time.now:

invoice.approve_date_corp_head = Time.now 

奇怪的是,有時線i.reload.approve_date_corp_head.strftime("%Y/%m/%d").should == Time.now.strftime("%Y/%m/%d")將失敗說,有一天區別日期比較。看起來,當我們晚上晚些時候運行rspec時(在早上12點之前),線路會失敗。我們在凌晨一直沒有看到失敗。

任何人都有關於這種奇怪行爲的想法?非常感謝。

+0

哪個時區你來自哪裏? – uday 2012-02-19 18:29:49

+0

美國中部時間。 – user938363 2012-02-19 18:37:18

+0

這是因爲區域中的時間差異,請使用'offset'和'Time.now'以使'Time.now'獲得您所在時區的時間。 – uday 2012-02-19 18:38:02

回答

3

首先,我會建議您確保您所測試的所有時間都是UTC。這樣它就可以阻止時區的差異,特別是當你在GMT時區以外的時區,它可能是早上或晚上。第二,我建議使用TimeCop來停止時間,因此如果你在.should步驟之前放置一個睡眠,如果你跑過單位時間,它仍然會給出正確的答案。

3

變化預期的規範,以

i.reload.approve_date_corp_head.strftime("%Y/%m/%d").should == Time.now.utc.strftime("%Y/%m/%d") 

我也呼應肖恩的建議,使用時空特警

+0

即使有時間旅行,也應該測試UTC的日期和時間以更好地模擬宿主環境。 – rxgx 2014-11-03 11:47:21

相關問題