2012-04-14 51 views
8

當您可以在測試中簡單地使用ActiveRecord來創建數據庫條目時,工廠/固定裝置的目的是什麼(我知道工廠像固定裝置一樣行事,但有點更清晰)?即News.create(...)工廠/裝置vs簡單Model.create(...)?

我只是不想看到使用工廠女孩,而不是簡單地創建一個新放過任何好處說使用ActiveRecord方法的新用戶..

感謝

回答

2

工廠並按照測試數據構建模式將讓你做的工作有點前面,但真的會節省您的時間和將來的工作。

比方說,你有一個汽車模型,並且該汽車擁有一個所有者,並且該所有者需要一個地址。其他每個領域都有其他領域。如果你想直接使用模型的方法,你將不得不在每一個需要它們的步驟定義中創建這些對象(和相應的關係)。有工廠?你會只定義一次

一旦您將Factory定義在一個具有相應結構的地方,您所要做的就是要求一輛汽車,並且Factory將採用其他車型的所有依賴關係。這不是很酷嗎?最後你想重點測試在這一點上。

什麼它也真的很酷的是,你可以覆蓋特定屬性,所以你可能有例如這樣的事情,如果你要覆蓋屬性速度:

Given /^I have a car running^/ 
Factory :car, speed => 100 
end 

從我的謙虛點查看,我喜歡Factory Girl,因爲它使我的測試代碼易於維護,並且非常易於閱讀。

+2

對應點:所有這些參數也適用於燈具。燈具整體速度更快。任何其他原因? – DGM 2012-07-01 19:14:30

+0

@DGM儘管我使用了我喜歡的裝置,但我有時會發現它們很難保持。 – 2012-07-27 18:32:08

2

工廠允許你把測試設置放在一個文件中。例如,我的項目工廠在spec/support/factories/project_factory.rb

如果我想更改默認標題或添加其他屬性,我可以在一個文件中執行此操作。隨着AR在我的測試中到處散落,我需要在每次使用這個實例時改變它。

5

工廠

創建/構建了一個對象,然後你使用它,只有當在一個名爲test。

您可以在一個文件中定義對象的「快樂路徑」(包括關聯)(如ryan提及的),然後在模式/模型關聯發生變化時維護一個文件。

燈具

模仿什麼數據庫應該看起來像一個單獨的記錄,它的加載到測試數據庫,然後使用。

夾具是模型的最終狀態並且存在於數據庫中,所以加載一次,並且可以在您認爲合適的測試中使用。

多個文件,你佈置你的夾具文件,以便每個文件和協會都照顧。

NewModel.create(...)

創建一次,如果你有這些塊100在一個測試或一個before(:each)

使用一次,即編寫和維護100個不同的對象,更別說像@user.profile.create(....) 100倍的關聯。在NewModel.create

一個文件工廠的

優勢保持,而不是grepping,並在您的代碼行替代多個buildcreate

必須說,在我的測試套件,我希望它是快速成爲可能,所以我下探FactoryGirl和使用燈具和NewModel.create前進。只是爲了看看它是否加快速度。我正在研究FG正在放慢我的套件的理論,如let()before(:each)