Как я могу определить несколько связанных объектов, используя Factory Girl? - PullRequest
8 голосов
/ 26 июня 2009

Документы Factory Girl предлагают этот синтаксис для создания (я думаю) родительско-дочерних ассоциаций ...

  Factory.define :post do |p|
    p.author {|a| a.association(:user) }
  end

Сообщение принадлежит Пользователю (его «автору»).

Что если вы хотите определить Фабрику для создания User с, которые имеют набор Post с?

Или что, если это ситуация «многие ко многим» (см., Например, обновление ниже)?


UPDATE

Я думал, что понял это. Я пробовал это ...

Factory.define(:user) do |f|
  f.username { Factory.next(:username) }

  # ...

  f.roles { |user|
    [
      Factory(:role),
      Factory(:role, {:name => 'EDIT_STAFF_DATA'})
    ]
  }
end

Сначала казалось, что это работает, но потом я получил ошибки валидации, потому что Ф.Г. дважды пытался сохранить пользователя с тем же именем пользователя и адресом электронной почты.

Так что я возвращаюсь к своему первоначальному вопросу. Если у вас есть отношение многие ко многим, например, скажем Users и Roles, как вы можете определить Фабрику, которая будет возвращать Users с некоторыми связанными Roles? Обратите внимание, что Roles должно быть уникальным, поэтому я не могу иметь F.G. создавая новый "ADMIN" Role в БД каждый раз, когда он создает User.

Ответы [ 4 ]

5 голосов
/ 21 августа 2009

Я не уверен, что это самый правильный способ сделать это, но он работает.

Factory.define(:user) do |u|
  u.login 'my_login'
  u.password 'test'
  u.password_confirmation 'test'
  u.roles {|user| [user.association(:admin_role),
                      user.association(:owner_role, :authorizable_type => 'User', :authorizable_id => u.id) ]}
end
4 голосов
/ 25 ноября 2009
1 голос
/ 21 апреля 2011

Я создал active_factory плагин , который имеет дело с вашей ситуацией в спецификации, например:

models { user - posts(3) }

Если есть интерес, я могу попытаться создать интеграцию с фабриками factory_girl.

1 голос
/ 22 декабря 2009

Недавнее обновление для фабричной девушки позволяет указывать ассоциации с блоками обратного вызова

...