Ruby on rails 3 工厂女孩嵌套工厂

Ruby on rails 3 工厂女孩嵌套工厂,ruby-on-rails-3,factory-bot,Ruby On Rails 3,Factory Bot,我有一个属于角色模型的账户模型 factory :role do name "student" end factory :account do user role end 第一个工厂创建一个名为“学生”的角色。第二个工厂创建一个与在前一个工厂中创建的学生角色关联的帐户。它还与一个用户关联…这对于这个问题并不重要 我有很多角色需要测试(管理员、学生、助理)。。。我不想在角色工厂中指定“学生”…这太静态了。如何指定在创建帐户工厂时要创建的角色?比如: factory :accou

我有一个属于角色模型的账户模型

factory :role do
  name "student"
end

factory :account do
  user
  role
end
第一个工厂创建一个名为“学生”的角色。第二个工厂创建一个与在前一个工厂中创建的学生角色关联的帐户。它还与一个用户关联…这对于这个问题并不重要

我有很多角色需要测试(管理员、学生、助理)。。。我不想在角色工厂中指定“学生”…这太静态了。如何指定在创建帐户工厂时要创建的角色?比如:

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

实现这一点的最佳方法是什么?

如果您想要纯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
但是,可以在创建factory对象时替代factory的特性。这允许更大的灵活性:

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")

你的解释太棒了!谢谢你的快速帮助!这看起来正是我需要的…我应该把助手文件放在哪里?仅在测试目录中?如果您使用的是rspec,则通常在
spec/support/
中。或者您可以直接将其放入
spec\u helper.rb