Ответ 1
Если вы хотите чисто FG-решение, вы можете использовать Traits:
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")