2013-01-22 44 views
1

我想使用Factory Girl生成大量模型集合,每個模型只有一個或兩個屬性。克隆工廠女孩的模型?

有沒有辦法讓工廠接受模型的實例?理想情況下,我想

before(:all) do 
    data1 = create(:instance, 
      :attribute_1 => 1, 
      :attribute_2 => 2, 
      :attribute_3 => "something", 
      :attribute_4 => "something else", 
      :attribute_5 => 5 
      ... 
    ) 

    data2 = create(:instance, 
        :attribute 2 => 15, 
        base: data1 
    ) 
    end 

數據2將作爲數據1的克隆被初始化,並且我可以指定新的屬性,我想改寫。

我一直在使用臨時屬性,但不能找到一種方式來實現類似的嘗試:

FactoryGirl.define do 
    factory :instance do 
    ignore do 
     base nil 
    end 
    attribute_1 { base.nil? ? argument.attribute_1 : base.attribute_1 + argument.attribute_1 } 
    attribute_2 { base.nil? ? argument.attribute_2 : base.attribute_2 + argument.attribute_1 } 
    ... 
    end 
end 

上午,我在完全錯誤的方式接近這一點?

+0

你想保持對模型的相同的關聯,同時改變那幾個屬性? – Zabba

+0

在這種情況下,我沒有任何關聯,在更廣泛的事物中,我可以想象既保存它們又不保留它們的情況。我還沒有調查工廠女孩管理協會的成語。 – ayang

回答

2

你可以更簡單地通過定義你想要使用的屬性的散列,然後稍微改變它來做第二次調用嗎?

喜歡的東西:

data_attributes = { 
     :attribute_1 => 1, 
     :attribute_2 => 2, 
     :attribute_3 => "something", 
     :attribute_4 => "something else", 
     :attribute_5 => 5 
     ... 
} 
data1 = create(:instance, data_attributes) 

data2 = create(:instance, data_attributes.merge(:attribute_2 => 1)) 

我明白,這並不完全回答你的問題,但它可能會解決你的問題。

+0

這並不糟糕。它實際上回答我的問題,謝謝! – ayang

1

如果你只是想產生不同的屬性,你看過sequences

FactoryGirl.define do 

    sequence :foo { |n| "#{n}" } 

    factory :data { foo } 
end 

在您的規格:

data1 = FactoryGirl.create(:data) 
data1.foo 
    => "1" 

data2 = FactoryGirl.create(:data) #It makes new, unique attributes for you 
data2.foo 
    => "2" 
+0

序列是一些屬性的選項。對於其他人,我喜歡分配與實際業務數據更接近的虛擬數據。不僅僅是爲了讓測試案例在我的腦海中保持準確。 – ayang

+0

您可以在FactoryGirl定義中混合序列和其他屬性。而且你可以製作序列的邏輯,使它們看起來更具商業性。 – eeeeeean