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

这里有一个类似的问题,有更多的选择:在 Rails 中使用 factory_girl 和具有唯一约束的关联。得到重复的错误

于 2012-07-11T05:14:35.607 回答
2

@CubaLibre 回答 FactoryBot 版本 5:

FactoryGirl.define do
  factory :league do
    initialize_with { League.find_or_initialize_by(id: id) }
    sequence(:id)
    name "European Championship"
  end
end
于 2019-05-15T08:59:24.007 回答
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

您仍然可以使用标准产品工厂“产品”创建具有平台“测试平台”的产品,但调用它创建第二个产品时会失败(如果平台名称设置为唯一)。

于 2012-02-17T11:03:25.287 回答