18

Factory Girl / Rspec2 /Rails3を使用しています。

factorys.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が別の組織(同じ名前)を作成しているためだと理解しています。

しかし、私がやりたいのは、すべて同じ組織に関連付けられた複数のメンバーシップを作成することです。それ、どうやったら出来るの?

ありがとう。

ショーン

4

3 に答える 3

19

既存の組織を確認して使用するか、存在しない場合は作成できます。

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

もう 1 つの方法は、再利用する各ファクトリに一意の識別子 (名前など) を使用し、それ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。明らかに、これを機能させるには個別の名前を使用する必要があります。

于 2010-10-26T19:28:24.590 に答える
4

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

于 2010-10-26T19:14:02.003 に答える
2

mongoid を使用すると、 #find_or_create_by メソッドの使用を Factory.attributes_for と組み合わせて、次のようなことを行うことができます

factory :membership do
    organization { Organization.find_or_create_by(Factory.attributes_for(:organization))}
end

ActiveRecord にも似たようなものがあると確信しています。

于 2011-10-11T17:32:36.063 に答える