工厂女孩嵌套厂(factory girl nested factory)

2019-07-17 16:33发布

我有belongs_to的一个榜样的帐户模型。

factory :role do
  name "student"
end

factory :account do
  user
  role
end

第一工厂创建一个名为“学生”的角色。 第二工厂创建关联到这是在以前的工厂创建的学生角色的帐户。 它也与用户......这是不是对这个问题的重要关联。

我有很多角色进行测试(管理员,学生,助手)......我不想在角色工厂指定“学生” ......那太静态。 如何指定在创建帐户出厂时创造什么样的作用? 喜欢:

  factory :account do
    user
    role_id { factory :role { name: "admin"} }
  end

什么是实现这一目标的最佳方式是什么?

Answer 1:

如果你想要一个纯粹的FG的解决方案,你可以使用特性:

factory :account do
  user

  trait :student do
    association :role, :name => "student"
  end

  trait :admin do
    association :role, :name => "admin"
  end
end

FactoryGirl.create :account, :student
FactoryGirl.create :account, :admin

然而,当你创建工厂对象可以覆盖工厂的属性。 这允许更多的灵活性:

FactoryGirl.create(:account,
  :role => FactoryGirl.create(:role, :name => "student")
)

因为这显然是罗嗦,我想创建一个小的辅助方法:

def account_as(role, options = {})
  FactoryGirl.create(:account,
    options.merge(:role => FactoryGirl.create(:role, :name => "student"))
  )
end

然后在您的测试:

let(:account) { account_as "student" }

或者,你可以只缩短了自己的角色生成,所以你可以使用它像:

def role(role, options = {})
  FactoryGirl.create :role, options.merge(:name => role)
end

account = FactoryGirl.create :account, :role => role("student")


文章来源: factory girl nested factory