14

工場の女の子/機械工の工場に、テストケース中に同じ工場名のオブジェクトを一度だけ作成し、常に同じインスタンスを返すように強制する構成がありますか? 私は知っています、私は次のようなことができます:

def singleton name
    @@singletons ||= {}
    @@singletons[name] ||= Factory name
end
...
Factory.define :my_model do |m|
   m.singleton_model { singleton :singleton_model }
end

しかし、もっと良い方法があるかもしれません。

4

3 に答える 3

22

ファクトリ内でマクロを使用してinitialize_with、オブジェクトが既に存在するかどうかを確認してから、再度作成しないでください。これは、上記のファクトリが関連付けによって参照されている場合にも機能します。

FactoryGirl.define do
  factory :league, :aliases => [:euro_cup] do
    id 1
    name "European Championship"
    owner "UEFA"
    initialize_with { League.find_or_create_by_id(id)}
  end
end

ここには、より多くの選択肢がある同様の質問があります: Using factory_girl in Rails with associations that have unique constraint. 重複エラーの取得

于 2012-07-11T05:14:35.607 に答える
1

これがあなたに役立つかどうかはわかりません。

このセットアップでは、ファクトリ 'singleton_product' を使用して n 個の製品を作成できます。これらの製品はすべて同じプラットフォーム (つまり、プラットフォーム「FooBar」) を持ちます。

factory :platform do
  name 'Test Platform'
end

factory :product do
  name 'Test Product'
  platform

  trait :singleton do
    platform{
      search = Platform.find_by_name('FooBar')
      if search.blank?
        FactoryGirl.create(:platform, :name => 'FooBar')
      else
        search
      end
    }
  end

  factory :singleton_product, :traits => [:singleton]
end

標準のプロダクト ファクトリ 'product' を使用してプラットフォーム 'Test Platform' を持つプロダクトを作成することはできますが、2 番目のプロダクトを作成するために呼び出すと失敗します (プラットフォーム名が一意に設定されている場合)。

于 2012-02-17T11:03:25.287 に答える