Доступ к фабрикам 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, определенный в другом файле здесь?
Ответы
Ответ 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 с тем же именем и заполнить его.