1

Factory Girl を使用して、それぞれが 1 つまたは 2 つの属性のみ異なるモデルの大規模なコレクションを生成したいと考えています。

ファクトリにモデルのインスタンスを受け入れる方法はありますか? 理想的には、私はしたいです

  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

data2 は data1 のクローンとして初期化され、上書きしたい新しい属性を指定するだけで済みます。

一時的な属性を使用してみましたが、次のようなものを実装する方法がわかりません:

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

私はこれに完全に間違った方法でアプローチしていますか?

4

2 に答える 2

2

使用する属性のハッシュを定義し、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))

それがあなたの質問に正確に答えるわけではないことを感謝しますが、それはあなたの問題を解決するかもしれません.

于 2013-01-22T22:05:27.537 に答える
1

異なる属性を生成しようとしているだけなら、シーケンスを見ましたか?

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"
于 2013-01-23T01:00:57.443 に答える