Ассоциация factory_girl_rails has_many включает в себя только одного из множества - PullRequest
2 голосов
/ 24 июня 2011

Я использую factory_girl_rails вместо приборов. Вот мои модели:

class User < ActiveRecord::Base
  has_many :tasks
end

class Task < ActiveRecord::Base
  belongs_to :user
end

Вот мои заводы:

Factory.define :user do |u|
end

Factory.define :task do |t|
  t.association :user, :factory => :user
end

В тесте я делаю это:

user = Factory.create :user
(1..5).each { Factory.create(:task, :user => user)}

Проблема, с которой я столкнулся, заключается в том, что впоследствии user.tasks содержит только одну задачу.

Я попытался определить фабрику user следующим образом:

Factory.define :user do |u|
  u.tasks {|tasks|  [tasks.association(:user)] }
end

и вот так:

Factory.define :user do |u|
  u.tasks {|tasks|  [tasks.association(:user), tasks.association(:user)] }
end

В обоих случаях Factory.create(:user) вызывает бесконечный цикл.

Ответы [ 2 ]

3 голосов
/ 24 июня 2011

Я думаю, что вы делаете задом наперед - вы можете создавать Задачи от Пользователя, но не наоборот, как вы пытаетесь это сделать. Концептуально ассоциация переходит от пользователя к задаче.

Я создал специальную фабрику для этого типа пользователей.

Factory.define :user_with_tasks, :parent => :user do |user|
  user.after_create {|u| 5.times { Factory.create(:task, :user => user) } }
end 

Кроме того, если вы просто хотите использовать фабрику по умолчанию, вы просто делаете это

Factory.define :task do |f|
  f.user :user
end 

Не нужно указывать фабрику

ОБНОВЛЕНИЕ: Похоже, что другие делали нечто подобное в прошлом: Заполнение ассоциации с детьми в factory_girl

0 голосов
/ 24 июня 2011

Ах, это работает:

Factory.define :task do |t|
  t.association :user
  t.after_create {|t| t.user.tasks << t}
end

Джон, ваш подход сработал бы, но я на самом деле не мог использовать то, что вы описали, потому что в моем тесте задачи должны также ссылаться на другую (не упомянутую) модель, и я не вижу способа ссылаться на нее в user_with_tasks заводское определение.

...