工厂女孩:如何在没有创建一个新的记录的记录到另一个记录相关联?
-
26-09-2019 - |
题
我使用工厂女孩/ Rspec2 / 3的Rails
在 factories.rb ,我有:
Factory.define :user do |user|
user.name 'Some guy'
user.email 'some_guy@somewhere.org'
user.password 'password'
end
Factory.define :org_admin, :parent => :user do |user|
user.email 'org_admin@somehwere.org'
end
Factory.define :user_with_membership_request, :parent => :user do |user|
user.email 'user_with_membership_request@somehwere.org'
end
Factory.define :organization do |org|
org.name 'MEC'
org.description 'Mountain Equipment Co-op'
end
Factory.define :membership do |membership|
membership.user { Factory(:user) }
membership.organization { Factory(:organization) }
end
Factory.define :admin_membership, :parent => :membership do |membership|
membership.user { Factory(:org_admin) }
membership.is_admin true
membership.status 'active'
end
Factory.define :membership_request, :parent => :membership do |membership|
membership.user { Factory(:user_with_membership_request) }
membership.status 'requested'
end
和然后在我的RSpec的测试我有:
it 'should accept the membership request' do
@org_admin = Factory(:org_admin)
test_sign_in(@org_admin)
@organization = Factory(:organization)
@membership_request = Factory(:membership_request)
put :update, :organization_id => @organization.id, :id => @membership_request.id, :acceptance => 'approve'
...
end
当运行测试,我得到:
Failure/Error: @membership_request = Factory(:membership_request)
Validation failed: Name has already been taken
我明白失败的原因是因为FactoryGirl被创建另一个组织(具有相同的名称)。
但我想要做的是创造都具有相同的组织相关的几个成员。我该怎么做呢?
感谢。
肖恩
解决方案
您可以检查现有的组织和使用它,或者创建一个如果不存在:
Factory.define :membership do |membership|
membership.user { Factory(:user) }
membership.organization { Organization.first || Factory(:organization) }
end
FactoryGirl 4+更新:
Factory.define do
factory :membership do
user { create(:user) }
organization { Organization.first || create(:organization) }
end
end
另一种方法是使用唯一标识符(例如:名称)的每个工厂要重用,然后用initialize_with
生成它:
factory :organization_1 do
ignore { organization_name 'Sample Organization 1' }
name { organization_name }
initialize_with { Organization.find_or_create_by_name(organization_name) }
end
现在到:organization_1
任何参考将总是检索相同Organization
。很显然,你必须使用不同的名称为这个工作。
其他提示
有两件事情。
1.您可能仍然要创建唯一的名称Factory(:organisation)
可以实现,使用Factory.sequence
这将产生独特的为你。
2.您可以在Factory(:membership_request, :organization => @organization)
通过使用现有的对象,而不是创建一个新的。
使用mongoid您可以结合使用与Factory.attributes_for的#find_or_create_by方法,做这样的事情。
factory :membership do
organization { Organization.find_or_create_by(Factory.attributes_for(:organization))}
end
我敢肯定的ActiveRecord有类似的东西。
不隶属于 StackOverflow