2010-02-10 66 views
19

我在我的rails應用程序中使用了factory_girl插件。對於每個模型,我都有一個相應的ruby文件,其中包含工廠數據,例如在* other *工廠訪問factory_girl工廠

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    # t.user ??? 
end 

我有很多不同類型的用戶(已經在用戶工廠中定義過)。如果我嘗試以下,但:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.user Factory(:valid_user) # Fails 
end 

我得到以下錯誤:

# No such factory: valid_user (ArgumentError) 

的:valid_user實際上是有效的,但 - 我可以在我的測試中使用它 - 只是沒有在我的工廠。有什麼辦法可以在這裏使用另一個文件中定義的工廠?

回答

4

嘗試使用關聯方法,如:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.association :valid_user 
end 
+0

你也可以't.association:user,factory :: valid_user' – Kris 2016-10-31 16:40:44

29

您應使用此代碼:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.user { Factory(:valid_user) } 
end 

結束語在{}的調用導致工廠女孩不評估括號內的代碼,直到:valid_thing工廠被創建。這將迫使它等待valid_user工廠被加載(你的例子失敗,因爲它尚未加載),它也會導致爲每個:valid_thing創建一個新的:valid_user,而不是所有的用戶都是相同的:valid_thing的(這可能是你想要的)。

+10

這個效果很好。只要知道'Factory(:valid_user)'語法已被棄用;改用'FactoryGirl.create(:valid_user)'。 – 2013-05-10 02:31:01

+0

當我嘗試構建(:valid_thing)時,使用'create(:valid_user)'實際上會進行創建,對嗎?有沒有辦法讓這個引用泛型創建/建立取決於哪個被稱爲? – mpgarate 2014-06-22 12:27:38

+0

@mpgarate - 不,編譯不會 – 2014-11-26 15:53:26

3

根據問題的年齡來判斷Factory Factory的一個新功能,但如果Factory中屬性的名稱與工廠名稱相同,只需在工廠中調用該屬性的名稱即可用相關的Factory代碼填充它。

FactoryGirl.define do 
    factory :thing do 
    user 
    end 
end 

這應該會導致用戶字段尋找具有相同名稱的工廠並從中填充該工廠。

+0

這對我有用 – 2017-04-26 04:42:58