ファクトリー・ガール:新規レコードを作成せずに別のレコードにレコードを関連付ける方法?

StackOverflow https://stackoverflow.com/questions/4027102

質問

私はファクトリー・ガール/ 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

、その後、私は私の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が(同じ名前の)別の組織を作成しているので、失敗の理由があることを理解ます。

しかし、私は何をしたいのですが、すべて同じ組織に関連するいくつかのメンバーシップを作成することです。私はそれを行う方法を教えてください。

感謝します。

ショーン

役に立ちましたか?

解決

あなたは既存の組織をチェックし、それを使用するか、または何も存在しない場合は、1つを作成することができます:

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を取得します。もちろん、あなたが仕事に、このために異なる名前を使用する必要があります。

他のヒント

2つのものがあります。 1.あなたはまだあなたがあなたのために一意に生成されますFactory(:organisation)を使用していることを達成することができますFactory.sequenceのための一意の名前を作成することもできます。 2.あなたは新しいものを作成するのではなく、既存のオブジェクトを使用するFactory(:membership_request, :organization => @organization)に渡すことができます。

とは、あなたがFactory.attributes_forと#find_or_create_by方法の使用を組み合わせて、このような何か。

を行う取ることができますmongoid
factory :membership do
    organization { Organization.find_or_create_by(Factory.attributes_for(:organization))}
end

私はActiveRecordのは、似た何かを持っていると確信しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top