Доступ к фабрикам factory_girl на * других * фабриках - PullRequest
20 голосов
/ 10 февраля 2010

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

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

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

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

Ответы [ 3 ]

31 голосов
/ 10 февраля 2010

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

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

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

4 голосов
/ 10 февраля 2010

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

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  t.association :valid_user
end
3 голосов
/ 01 марта 2017

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

FactoryGirl.define do
   factory :thing do
     user
   end
end

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

...