2011-03-03 41 views
57

當我可以使用before(:each)塊時,rspec測試中Factory Girl的用途是什麼?感覺Factory Girl和before(:each)唯一的區別在於工廠在測試之外準備對象創建。這是正確的嗎?工廠女孩 - 目的是什麼?

+0

這是怎麼FactoryGirl與ActiveReccord https://cbabhusal.wordpress.com/2015/04/21/ruby-on-rails-factory互動-girl-how-it-interact-with-activerecord/ – illusionist

回答

59

Factory GirlSham這樣的寶石允許您爲有效和可重用對象創建模板。它們是根據固定記錄必須加載到數據庫中的固定裝置而創建的。當你實例化對象時,它們允許更多的自定義,並且它們旨在確保你有一個有效的對象來處理。它們可以在測試中的任何地方以及測試鉤之前和之後使用。 (:each),before(:all),after(:each)和after(:all)之前的所有目標都是爲了給你一個設置和拆卸地點,以便在一個測試組中共享。例如,如果您要爲每個測試創建一個新的有效用戶,那麼您需要在before(:each)鉤子中執行此操作。如果你打算從文件系統中清除一些文件,你希望在hook之前這樣做。如果你的測試都創建了一個tmp文件,並且你想在測試之後將其刪除,那麼你會在你的after(:each)或之後(:all)鉤子中執行該操作。

這兩個概念的不同之處在於,工廠不是圍繞您的測試創建鉤子,而是旨在創建有效的Ruby對象和記錄,以便您可以保持對象的創建靈活和乾爽。鉤子之前和之後的目標是在示例組中共享的設置和拆卸任務,以便您可以保持設置和拆卸代碼乾燥。

+7

另一種說法是:FactoryGirl工廠就像'give_me_a_valid_model'函數。如果你需要在多個''之前:每個'塊',它會爲你節省一些重複。設置有效模型(關聯,確保唯一值等)越複雜,它可以爲您節省更多的精力。 –

17

FactoryGirl替換測試中的燈具。這樣,當您更改數據模型時,您不必將燈具保持在最新狀態。在添加更多邊緣情況下,燈具也可能變得笨重。

FactoryGirl隨時生成數據,添加和刪除字段要容易得多。此外,您可以在設置中使用它,以確定如何使用燈具。

這是否使它更清晰?

+2

花了我一段時間才弄清楚,工廠是一個「智能」替代裝置。我仍然有興趣瞭解更多關於模擬和存根之間的區別。 – Docunext

+0

它確實如此,謝謝。 :)很高興知道他們是一個很好的替代裝置。這有點奇怪,因爲Hartl的教程(這很好,順便說一句)進出夾具和工廠女孩之間。我發現自己很困惑。現在我知道了,我可能會更頻繁地使用它。 :) – curiousdork

6

夾具定義在整個應用程序中都是全局的。工廠可以是本地的 - 所以特定於獨立測試用例的數據是針對該特定上下文的設置,而不是在單個全局固件文件中。

This book涵蓋的主題非常好,如果你想要更多的讀物