2012-11-01 231 views
0

這可能是我的一個基本誤解。我的應用程序中有一堆邏輯,它從幾個表中收集數據集並將它們組合到內存結構中。我想爲該邏輯編寫測試。Rails測試數據,在數據庫中

在我看來,夾具,工廠女孩和類似的工具建立內存模型實例。如果我進行activerecord調用,如Model.find(foo:12),那麼這些調用是否僅適用於已保存的記錄?謝謝!

回答

2

在大多數情況下,我同意@ mrbrdo的觀點:prefer rpsec的存根方法。但作爲一名rails程序員,我認爲你必須知道「fixture」和「stub」。

無論是yaml文件還是factory girl data,燈具都會保存到數據庫中。請參閱您的config/database.yml文件以瞭解它們的位置。實際上,當你想要確保在你的測試過程中總是有一些數據在數據庫中時,這很有用,比如一個帶有固定ID的「管理員用戶」。

存根,它比夾具更快,因爲它不會保存到數據庫中,並且當您要執行無法通過「夾具」實現的測試時可能非常有用。

因此,我建議您在真實的編碼生活中嘗試兩種方法,並根據真實的環境選擇其中的任意一種。

+0

只需添加,即使您在所有測試中需要管理員用戶,仍然不一定需要固定設備或數據庫或存根。你可以有一個之前(:每個)與AdminUser.new用戶名:... 這取決於你使用這個管理員用戶的方式(如果它真的需要在數據庫中),但即使這樣你通常可以逃脫它如果你使用nulldb。不使用數據庫唯一真正的缺點是它通常需要多一點時間來編寫這樣的測試,但在大多數情況下,測試總體上會更好(更快,更孤立)。 – mrbrdo

1

你在說什麼不對,夾具或工廠女生使用數據庫。但是,我會避免使用夾具,但現在人們通常不會使用它們。

但是真正編寫測試的正確方法是將activerecord調用存根刪除,因爲這會使測試速度加快。你想要測試的是將數據結合到結構中,而不是將數據從數據庫中提取出來 - 該部分已經在activerecord的測試中進行了測試。

所以存根出這樣的發現者(如果你使用的RSpec):

Model.should_receive(:find).with(foo: 12) do 
    Model.new(foo: 12, other_attribute: true) 
end 

所以,當你的方法正在測試電話Model.find(富:12),它會得到

Model.new(foo: 12, other_attribute: true) 

這比在數據庫中實際創建它然後將它拉出來要快得多,而且對於測試的內容沒有任何意義 - 這並不重要。您也可以保存在實例上等等,具體取決於您的方法正在做什麼。請記住,從數據庫中檢索數據並保存到數據庫都已在activerecord的測試中進行過測試,您無需重新進行這些測試 - 只需關注您的特定邏輯即可。

+0

謝謝!後續......我的情況涉及4個表格,它們以4個belongs_to,has_many對彼此錯綜複雜地相互連接。 (基本上3個表格是沿着行,列和頁面的索引,並且第四個模型表示一個值。要點是,會有很多細微的瑕疵......我發現速度上的優勢,但我很可能在編寫存根時犯錯,就像我在實際的代碼中一樣。 – pitosalas

+0

我不確定你在問什麼,但你只需要在你正在測試的代碼中存儲你實際使用的東西。所以如果你不打電話給一些關聯,那麼你不需要存根。 你可以使用另一個工具,如果你想有這樣的快速測試是nulldb:https://github.com/nulldb/nulldb。您也可以將FactoryGirl.build和nulldb一起用於關聯。 當然,您可以在數據庫中創建記錄並且工作正常(例如使用factory_girl),它會變得更慢。 – mrbrdo