2013-10-15 90 views
0

我想出了這個讓我花太多時間跟蹤的bug。這兩個FactoryGirl聲明的實際區別是什麼

我有這樣的:

FactoryGirl.define do 
    factory :global_list do 
    list_id FactoryGirl.create(:user).liked_items_list.id 
    end 
end 

只是包裹在一個塊:

FactoryGirl.define do 
    factory :global_list do 
    list_id { FactoryGirl.create(:user).liked_items_list.id } 
    end 
end 

所以我知道,在第二次調用,該塊使其無法運行,直到像一個實際的通話FactoryGirl.create(:global_list)被創建;我認爲這是通過FG轉換並轉換爲proc。還有其他的實際區別嗎?我希望有一種方法可以在詳細模式下運行它們。

THX的任何見解

回答

1

兩種情況之間的主要區別是:

  1. 在第一種情況(無塊)當工廠加載LIST_ID表達式進行求值,永不再。加載工廠時生成的list_id將用於工廠創建的所有對象。所以所有的global_list對象都有相同的list_id。

  2. 在第二種情況下(塊),只要工廠被調用(例如,調用build(:global_list),create(:global_list)),就會對list_id表達式進行評估。如果由表達式導致的list_id發生更改,則不同的工廠對象將具有不同的list_id。