Bvu*_*Ic7 9 testing ruby-on-rails ruby-on-rails-plugins ruby-on-rails-3 factory-bot
我有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
Run Code Online (Sandbox Code Playgroud)
我想做这个:
@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, ......>
Run Code Online (Sandbox Code Playgroud)
但这不起作用!它告诉我,我的个人资料模型不正确,因为没有用户!(它在用户之前保存配置文件,因此没有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
Run Code Online (Sandbox Code Playgroud)
以这种方式修复它(如这篇文章中所述)
Factory.define :user do |u|
u.login "test"
u.profile { |p| p.association(:profile) }
end
Run Code Online (Sandbox Code Playgroud)
您还可以做的(因为用户不需要配置文件存在(没有对其进行验证)是进行两步构建
Factory.define :user do |u|
u.login "test"
end
Run Code Online (Sandbox Code Playgroud)
进而
profile = Factory :profile
user = Factory :user, :profile => profile
Run Code Online (Sandbox Code Playgroud)
我想在这种情况下,您甚至只需要一步,在配置文件工厂中创建用户并执行
profile = Factory :profile
@user = profile.user
Run Code Online (Sandbox Code Playgroud)
这似乎是正确的做法,不是吗?
(根据您的评论)为了避免保存配置文件,请使用 Factory.build 来仅构建它。
Factory.define :user do |u|
u.login "test"
u.after_build { |a| Factory(:profile, :user => a)}
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4164 次 |
| 最近记录: |