Отношение Factory_girl has_one к validates_presence_of - PullRequest
9 голосов
/ 06 сентября 2010

У меня есть 2 модели:

# user.rb
class User < ActiveRecord::Base
  has_one :profile, :dependent => :destroy
end

# profile.rb
class Profile < ActiveRecord::Base
  belongs_to :user
  validates_presence_of :user
end

# user_factory.rb
Factory.define :user do |u|
  u.login "test"
  u.association :profile
end

Я хочу сделать это:

@user = Factory(:user)
=> #<User id: 88,....>
@user.profile
=> #<Profile id:123, user_id:88, ......>

@user = Factory.build(:user)
=> #<User id: nil,....>
@user.profile
=> #<Profile id:nil, user_id:nil, ......>

Но это не работает! Это говорит мне, что моя модель профиля не верна, потому что нет пользователя! (он сохраняет профиль перед пользователем, поэтому user_id отсутствует ...)

Как я могу это исправить? Перепробовал все .. :( И мне нужно вызвать Factory.create (: user) ...

UPDATE

Исправлена ​​эта проблема - теперь работает с:

# user_factory.rb
Factory.define :user do |u|
  u.profile { Factory.build(:profile)}
end

# user.rb
class User < ActiveRecord::Base
  has_one :profile, :dependent => :destroy, :inverse_of => :user
end

# profile.rb
class Profile < ActiveRecord::Base
  belongs_to :user
  validates_presence_of :user
end

1 Ответ

3 голосов
/ 06 сентября 2010

Исправьте это так (, как описано в этом посте )

Factory.define :user do |u|
  u.login "test"
  u.profile { |p| p.association(:profile) }
end

То, что вы также можете сделать (поскольку пользователю не нужен профиль для существования (на нем нет проверки)), это выполнить двухэтапное построение

Factory.define :user do |u|
  u.login "test"
end

, а затем

profile = Factory :profile
user = Factory :user, :profile => profile

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

profile = Factory :profile
@user = profile.user

Кажется, это правильный путь, не правда ли?

Обновление

(согласно вашему комментарию) Чтобы избежать сохранения профиля, используйте Factory.build только для его построения.

Factory.define :user do |u|
  u.login "test"
  u.after_build { |a| Factory(:profile, :user => a)}    
end
...