2

我想使用FactoryGirl構建模型的內存中存根,然後讓所有ActiveRecord查詢僅針對這些查詢運行。例如:如何完全避免在RSpec測試中使用數據庫?

# Assume we start with an empty database, a Foo model, 
# and a Foo factory definition. 

#foo_spec.rb 
stubbed_foo = FactoryGirl.build_stubbed(:foo) 

# Elsewhere, deep in the guts of application 
Foo.first() # Ideally would return the stubbed_foo we created 
      # in the test. Currently this returns nil. 

解決方案可能是使用內存數據庫。但是,上述情況可能嗎?

+0

如果你沒有任何表格,那麼就沒有模型可以遵循,所以你的存根模型可以像任何對象一樣工作,而不必與實際的模式匹配將存在於生產中。這可能是一個壞主意。你爲什麼試圖以這種方式繞過ActiveRecord? –

+0

你可以使用燈具而不是工廠女孩 – trueinViso

+0

@trueinViso我不認爲燈具會解決我的問題,因爲在調用'first()'或任何其他查詢方法時,Foo類仍然會去數據庫。 –

回答

0

如果你爲避免數據庫的原因,是加快你的測試,那麼有更好的方法。使用FactoryGirl.build儘可能代替create。只要您的代碼不會從數據庫中提取記錄,這種方法就行得通。這適用於具有結構良好的代碼的單元測試。 (例如,它有助於使用Service Objects和單元獨立測試。

對於那些確實需要從數據庫中讀取(在你Foo.first例如電話),您可以使用FactoryGirl.create和使用事務燈具的測試。這將創建一個數據庫事務在每個測試實例的開始,然後在例子的最後回滾事務。如果你使用after_commit或其他回調可能會出現問題,當您使用回調在你的ActiveRecord模型如after_commit

在需要關閉數據庫事務的模型中(或者在代碼中使用顯式事務),我建議設置DatabaseCleaner。H ere就是配置和使用它的一個例子:https://gist.github.com/RobinDaugherty/9f4e5f782d9fdbe191a23de30ad8b539

+0

是的,我的動機是保持測試套件的速度。 儘量使用'FactoryGirl.build'和'FactoryGirl.build_stubbed',但我一直在尋找一種方法來完全消除數據庫依賴。我不認爲交易裝置會完成我想要的任務。 這可能是我過早優化的一個案例,但我只是想確保在我開始編寫數據庫交互測試之前這是不可能的。 –

+0

我懷疑你會看到從'FactoryGirl.build'到使用存根的速度有任何實質性的增加。但是,由於使用模型工廠確保模型行爲是正確的,您在測試中肯定會失去質量。我不會推薦它。 –