2015-08-30 118 views
0

我有一個update類型的方法,我試圖在使用MiniTest和FactoryGirl的Rails中測試。我的問題是雖然我可以看到更新正確發生更新功能,但它似乎不能正確地繼續回到測試功能。數據庫記錄沒有保存/堅持Rails測試功能?

這些是我們正在使用的對象,(obj指定缺省location,開始了:

location1 = create :location 
location2 = create :location 
obj = create :object, location: location1 

然後我們調用update函數,該函數id的:

obj.update_location(obj.id, location2.id) 

The update功能:

def update_location(obj_id, loc_id) 
    @obj = Object.find(obj_id) 
    @obj.location_id = loc_id 
    @obj.save 
end 

但是當,早在測試文件,我嘗試assert的變化...

assert_equal obj.location_id, location2.id 

...我收到了故障。控制檯告訴我,obj.location_id仍等於location1.id!爲什麼是這樣?

看來,@obj.save正常工作,因爲我插在更新功能puts @obj.inspect並輸出正確更新location_id

我不認爲它與事務回滾有關,因爲這全部發生在單個測試中。 (而我的印象是事務回滾只發生在兩次測試之間)。

綜上所述,我的問題是:爲什麼我的更新不能堅持回MiniTest test功能?

編輯:這裏是整個測試:

test "update_location" do  
    location1 = create :location 
    location2 = create :location 

    #give the obj a starting `type` 
    obj = create :obj, location: location1 

    obj.update_location(obj.id, location2.id) 
    assert_equal obj.location_id, location2.id  
end 
+0

我想我們需要看到整個測試周期,然後才能以合理的方式思考它。我也會嘗試'保存!'以避免吃例外。 –

+0

我在文件中添加了整個測試功能,並且只添加了測試功能。我正在使用'rake test test/models/obj_test.rb'運行該文件 –

+0

(@ DaveNewton-Tried'保存!',沒有幫助...) –

回答

0

問題解決了,這裏是我的理解:

的問題是如何Rails的ORM工作。原始對象'obj'在創建時加載數據庫中的數據...但後來對數據庫的更改不會自動存儲到obj。我以爲obj.some_attribute查看數據庫的記錄obj爲了找到屬性值 - 但實際上我認爲這些屬性只是在創建時加載到變量中,並且如果我撥打電子郵件obj.some_attribute稍後的時間點。

通常,當更新通過變量本身完成時,Rails知道爲您更新變量。所以,當你編寫obj.some_attribute = 5,然後寫obj.some_attribute時,Rails知道該值應該是5.但是這種情況並不會發生在這種情況下,因爲它不通過變量更新記錄。

所以需要做的只是從數據庫中的reload對象。

所以assert_equal obj.reload.location_id, location2.id的作品!

0

2個問題,可以幫助你找到答案:你爲什麼要使用一個實例

  1. 變量@obj而不是一個局部變量obj

  2. 爲什麼你有一個特殊的方法來更新1列。 update_column不適合你嗎?

+0

Tnx的幫助!下面是你的Q的答案... 1 - 不知道爲什麼會這樣使用,但請注意它在測試的單獨文件中(它位於'app/models/objects.rb'中)。 2 - 它是一個更大的方法的一部分,做更多的事情,我只是簡化它爲... ... P –

+0

(我嘗試從'@ obj'切換到只是'obj',無濟於事。) –

相關問題