Подтвердить что ты не робот

Factory Девушка вложенная factory

У меня есть модель учетной записи, которая принадлежит к ролевой модели.

factory :role do
  name "student"
end

factory :account do
  user
  role
end

Первый factory создает роль под названием "student". Второй factory создает учетную запись, связанную с ролью студента, которая была создана в предыдущем factory. Это также связано с пользователем... что не важно для этого вопроса.

У меня есть много роли для тестирования (admin, student, assistant)... Я не хочу указывать "ученик" в роли factory... слишком статично. Как указать, какую роль создавать при создании учетной записи factory? Как:

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

Каков наилучший способ для этого?

4b9b3361

Ответ 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")