2015-08-24 14 views
0

我正在爲Rails應用程序編寫非常標準的RSpec控制器測試。我遇到的一個問題是簡單地測試時間值是否在更新操作中持續存在。Rails 4/RSpec - 測試時間值持續到控制器規格中的MYSQL數據庫

在我的控制,我有:

def update 
    if @derp.update_attributes(derp_params) 
    redirect_to @derp, flash: {success: "Updated derp successfully."} 
    else 
    render :edit 
    end 
end 

@derp有型時間的屬性。我可以測試所有的更新操作的其它屬性如下:

describe "PATCH #update" do 
    before do 
    @attr = { 
     attribute_1: 5, attribute_2: 6, attribute_3: 7, 
     time: Time.zone.now 
    } 
    end 
end 

我得到的錯誤是:

1) DerpsController logged in PATCH #update updates the derps's attributes 
Failure/Error: expect(derp.time).to eq(@attr[:time]) 

    expected: 2015-08-24 18:30:32.096943000 -0400 
     got: 2000-01-01 18:30:32.000000000 +0000 

    (compared using ==) 

    Diff: 
    @@ -1,2 +1,2 @@ 
    -2015-08-24 18:30:32 -0400 
    +2000-01-01 18:30:32 UTC 

我使用時空特警試圖也用to_s比較或to_i ...但是數據類型時間的每個屬性都會在今年完全關閉。我見過一些帖子,說你如何期待它在1秒之內,以及如何處理,但看起來我的一年完全沒有了?

這不是那麼困難 - 我只是想測試控制器可以花一些時間發送給它並將其保存到數據庫。

我在這裏錯過了什麼?

編輯:幾天後沒有幫助。讓我嘗試重新發生所發生的事情 - 日期被剝離,因爲它是一個MYSQL類型的TIME。注意2000-01-01 ...

回答

0
let(:time) {'Mon, 24 Aug 2015 23:19:09'} 
    describe "PATCH #update" do 
     before do 
     @attr = { 
      attribute_1: 5, attribute_2: 6, attribute_3: 7, 
      time: time.in_time_zone('Eastern Time (US & Canada)').to_datetime 
     } 
     end 
    end 

,而不是在記錄保存Time.zone.now,定義一個變量time,並與時間更新記錄,所以你知道哪個時間應該保存在數據庫中。然後,當你比較的時候,期待這段時間回來。

+0

這仍然不適合我: 預計:2015-04-20 16:20:08.000000000 -0400 得到:2000-01-01 16:20:08.000000000 +0000 – gregblass

0

我落得這樣做:

let(:time) {'01 Jan 2000 16:20:00'} 

我實在找不到什麼好解釋如何或爲何Rails正在存儲時間爲2000-01-01,或任何輔助方法來格式化時間像那樣。我檢查了控制器參數及其實際發送到控制器的2000-01-01日期。有些人說只使用日期時間,但我確實試圖存儲一天中的某個時間,所以我認爲這個用例並不合理。

無論如何,我可以在我的規格和作品中的任何地方使用該時間變量。