2013-10-14 117 views
0

更新mongoid場我試圖單元測試下面的代碼:單元測試使用RR

require 'mongoid' 

class Seller 
    include Mongoid::Document 

    field :updated_at, type: Time 

    def update_updated_at 
    updated_at = Time.now 
    save 
    end 

end 

這是我嘗試

describe Seller do 

    describe 'update_updated_at' do 

    it 'sets updated_at to Time.now' do 
     now = Time.new(2013,10,14) 
     seller = Seller.new 
     mock(Time).now { now } 
     mock(seller).updated_at= now 
     mock(seller).save 
     seller.update_updated_at 
    end 

    end 

end 

我收到以下故障

updated_at=(2013-10-14 00:00:00 -0600) 
Called 0 times. 
Expected 1 times. 

回答

1

Here是更新記錄updated_at屬性到當前時間的本地方法 例如

seller = Seller.first 
seller.touch # updated_at set to current time 

嘲笑Time類有一個寶石timecop這是超級好用,死簡單TIME,DATETIME嘲諷e.g

it 'sets updated_at to Time.now' do 
    now = Time.new(2013,10,14) 
    Timecop.freeze(now) do 
     seller = Seller.new 
     seller.save # 2013-10-14 
     seller.touch # same time 2013-10-14 
    end 
end 
+0

+1用於引入timecop。 +1用於觸摸。 – zhon

1

沒有必要嘲笑這一點。想想你在做什麼:你正在設置updated_at並將其保存到數據庫。它通常是一種代碼異味來存儲/模擬#save - 你可以相信它正在做它應該做的事情,這是對數據庫的持久屬性。因此,調用方法,重新加載記錄,然後斷言updated_at被設置爲當前時間(在調用方法時)。

或者,只是使用觸摸;)

通過本次測試失敗,因爲你使用updated_at = Time.now的方式;如果您使用self.updated_at = Time.now,它會通過。

+1

這是*單元測試*。我不想在單元測試中打我的數據庫。嘲笑'''保存'''確保我打電話保存沒有擊中數據庫。 – zhon

+0

+1用於解決'''self.update_at = Time.now'''的問題。謝謝! – zhon