В определении фабрики присвойте атрибут, используя атрибут другой фабрики - PullRequest
0 голосов
/ 16 марта 2012

У меня есть две фабрики factory_girl, contact и user. Контакт имеет атрибут dest_user_id, который является внешним ключом для user, но может иметь значение NULL. Для этого атрибута я хочу создать нового пользователя с использованием фабрики user, а затем присвоить его идентификатор dest_user_id. Есть способ сделать это?

1 Ответ

0 голосов
/ 18 марта 2012

Наличие внешнего ключа dest_user_id не должно изменять подход, если отношение остается таким же, как и у модели.Предполагая, что contact belongs_to user и user либо has_one или has_many contacts, вы можете достичь того, что вы хотите, следующим образом:

Сначала создайте фабрики:

FactoryGirl.define do
  factory :user do
    Field 1
    Field 2 
    # etc
  end

  factory :contact do
    # Add only the minimum fields required to create a contact, but not the association
    Field 1
    Field 2

    factory :contact_with_user do
      # then you add the association for this inherited factory
      # we can use 'user' here as the factory is the same as the association name
      user
    end
  end
end

С помощью этой настройки вы создаете contact без user, и поэтому dest_user_id равен NULL, когда вы используете FactoryGirl.create(:contact) в своем тесте / спецификации.

Длясоздайте user и присвойте идентификатор в поле dest_user_id на contact, в котором вы будете использовать следующее:

@user = FactoryGirl.create(:user)
@contact = FactoryGirl.create(:contact_with_user, :user => @user)

Такой подход обеспечивает максимальную гибкость, так как вы можете создать contact с или безпользователь, и вы можете передать user.id в модель контакта, только если он вам нужен для определенного теста.Если вы наберете FactoryGirl.create(:contact_with_user), то автоматически будут созданы contact и user, но вы не сможете управлять назначением dest_user_id, которое вы получите при использовании FactoryGirl.create(:contact_with_user, :user => @user)

...