2012-08-10 93 views
0

我試圖與我的工廠使用工廠女孩創建關聯的方式,以便相關聯的對象共享正確的數據以將它們匹配在一起。Rails工廠女孩協會

我遇到了對象A與對象C的一個實例相關的場景,而對象B與對象C的另一個實例有關,當我希望它們都與對象的相同實例相關時C.

工廠女孩 - https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md 使用最新版本

這裏是什麼,我想在我的項目做一個簡單的例子。

FactoryGirl.define do 
     factory :neutral_position, class: FinancialAccounting::Update::Neutral::Position do 
      created_at { Time.now } 
      updated_at { Time.now } 

      factory :valid_neutral_position do 
      association :security, factory: :security 

      factory :valid_neutral_position_with_production_record do 
       association :position, factory: :position 

       # This modifies the created production account record so the attributes match. 
       FactoryGirl.modify do 
       factory :position, class: FinancialAccounting::Position do 
        association :security, factory: :security 
       end 
       end 
      end 
      end 

     end 
     end 

注意我試圖修改關聯的位置,以便它指向在:valid_neutral_position工廠中生成的相同安全性。此代碼目前創建兩個獨立證券,因此中立頭寸與一個證券關聯,而頭寸工廠與不同證券關聯。

我該如何做到這一點?我在整個應用程序中都看到了這個問題,所以想清楚這一點會大大改善我的應用程序測試套件並使我的代碼保持乾爽。

回答

1

實際上,在您的測試/規格而非工廠定義中進行分類更容易。

首先創建一個安全並將其分配給一個變量。

然後,當創建一個對象時,您要依賴該安全性將該變量傳遞給工廠構造函數。

雖然你的例子是有點複雜的,可能是這樣的:

specific_security = FactoryGirl.create(:security) 
valid_natural_position = FactoryGirl.create(:valid_natural_position, security: specific_security) 
position = FactoryGirl.create(:position, security: specific_security) 

這樣可以確保該對象是否建立在你的測試,你需要它們的方式。由於兩個輔助工廠不再自動創建安全對象,因此它具有減少創建的對象數量的額外好處。

+0

這就是我們也在做的事情,但爲什麼工廠協會呢? – 2014-10-01 08:25:56

1

我其實用了一種不同的方法。它包含在工廠中,從而導致更清潔的測試。但是,當你不一定需要時,我確實發現必須生成更多對象的缺點。

FactoryGirl.define do 
    factory :neutral_position, class: FinancialAccounting::Update::Neutral::Position do 
    created_at { Time.now } 
    updated_at { Time.now } 

    factory :valid_neutral_position do 
     has_production_position 
    end 

    trait :has_production_position do 
     association :position, factory: :position 
     security { position.security } 
    end 

    end 
end