Sea*_*ner 18 ruby-on-rails rspec2 factory-bot
我正在使用Factory Girl/Rspec2/Rails 3.
在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
Run Code Online (Sandbox Code Playgroud)
然后在我的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
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,我得到:
Failure/Error: @membership_request = Factory(:membership_request)
Validation failed: Name has already been taken
Run Code Online (Sandbox Code Playgroud)
我理解失败的原因是因为FactoryGirl正在创建另一个组织(具有相同的名称).
但我想做的是创建几个与同一组织相关的成员资格.我怎么做?
谢谢.
肖恩
zet*_*tic 19
您可以检查现有组织并使用它,或者如果不存在则创建一个组织:
Factory.define :membership do |membership|
membership.user { Factory(:user) }
membership.organization { Organization.first || Factory(:organization) }
end
Run Code Online (Sandbox Code Playgroud)
FactoryGirl 4+更新:
Factory.define do
factory :membership do
user { create(:user) }
organization { Organization.first || create(:organization) }
end
end
Run Code Online (Sandbox Code Playgroud)
另一种方法是为要重用的每个工厂使用唯一标识符(例如:名称),然后使用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
Run Code Online (Sandbox Code Playgroud)
现在任何引用都:organization_1将始终检索相同Organization.显然,您必须使用不同的名称才能工作.
| 归档时间: |
|
| 查看次数: |
4783 次 |
| 最近记录: |