Factory Girl - имеет много ассоциаций - PullRequest
4 голосов
/ 14 мая 2011

Я использую фабричную девушку с rspec, вот что у меня есть:

factories.rb

Factory.define :user do |f|
  f.sequence(:fname) { |n| "fname#{n}" }
  f.sequence(:lname) { |n| "lname#{n}" }
  f.sequence(:email) { |n| "email#{n}@google.com" }
  f.password               "password"
  f.password_confirmation { |u| u.password }
  f.invitation_code        "xxxxxxx"
end

Factory.define :group do |f|
  f.sequence(:name) { |n| "myGroup#{n}" }
  f.sequence(:private_email) { |n| "myGroup#{n}" }
end

Factory.define :permission do |f|
  f.role_id         1
end

groups_controller_spec.rb

describe GroupsController do
  include Devise::TestHelpers

  before (:each) do
    @user1 = Factory.create(:user)
    @user1.confirm!
    sign_in @user1
    @group = Factory.create(:group)
    @group2 = Factory.create(:group)
    @group3 = Factory.create(:group)
    @permission_user_1 = Factory.create(:permission, :user => @user1, :creator_id => @user1.id, :group => @group)
    @permission_user_2 = Factory.create(:permission, :user => @user1, :creator_id => @user1.id, :group => @group2)
    @permission_user_3 = Factory.create(:permission, :user => @user1, :creator_id => @user1.id, :group => @group3)
  end

.......

Проблема в том, что в групповой модели есть поле для user_id, которое не устанавливается фабрикой. Как я могу создать пользователей, а затем заставить фабрику создать группу от имени этого пользователя. Нравится @ user1.group.factory.create (: group)?

Есть идеи? Спасибо

1 Ответ

15 голосов
/ 15 мая 2011

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

Factory.define :user_with_group, :parent => :user do |u|
  u.groups  { |g| [ g.association(:group), 
                    g.association(:group)
                  ]}
end

Вы можете увидеть множество примеров фабрик на https://github.com/drhenner/ror_ecommerce/tree/master/spec/factories

...