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

Доступ к фабрикам factory_girl в * других * фабриках

Я использую плагин factory_girl в моем приложении rails. Для каждой модели у меня есть соответствующий файл ruby, содержащий данные factory, например.

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  # t.user ???
end

У меня много разных типов пользователей (уже определенных пользователем factory). Если я попробую следующее:

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  t.user Factory(:valid_user) # Fails
end

Я получаю следующую ошибку:

# No such factory: valid_user (ArgumentError)

Действительно: valid_user действительно действителен, но я могу использовать его в своих тестах - просто не на моих фабриках. Есть ли способ использовать factory, определенный в другом файле здесь?

4b9b3361

Ответ 1

Вы должны использовать этот код:

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  t.user { Factory(:valid_user) }
end

Обертка вызова в {} вызывает Factory Девушка, чтобы не оценивать код внутри фигурных скобок, пока не будет создано: valid_thing Factory. Это заставит его ждать, пока загрузится: valid_user Factory (ваш пример не работает, поскольку он еще не загружен), это также приведет к созданию нового: valid_user для каждого: valid_thing, а не того же пользователя для всех: valid_thing (что, вероятно, вы хотите).

Ответ 2

Попробуйте использовать метод ассоциации, например:

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  t.association :valid_user
end

Ответ 3

Потенциально новая функция для Factory Girl, судя по возрасту вопроса, но если имя вашего атрибута в Factory совпадает с именем factory, просто называя имя атрибут в вашем Factory заполнит его с помощью связанного поколения Factory.

FactoryGirl.define do
   factory :thing do
     user
   end
end

Это должно привести к тому, что поле пользователя будет искать Factory с тем же именем и заполнить его.