2013-07-10 7 views
22

デフォルトでは、FactoryGirlはアソシエーションのファクトリを呼び出して作成します。ファクトリの関連付けをパラメータとして渡すことができます。しかし、どのように私は協会のチェーンで深く使用すべきオブジェクトを通過することができますか?例えばFactoryGirlのアソシエーションチェーンを介してパラメータを渡す方法

私はCURRENT_USERに属するアカウントを持っているPostsManagerを、持っているポストを持っています。

Factory(:post)を実行すると、(スタブされた)current_userに属していないAccountを作成するPostsManagerが作成されます。

account = Factory(:account, user: current_user) 
post_manager = Factory(:post_manager, account: account) 
post = Factory(:post, post_manager: post_manager) 

は、私は何をしたいことはすべての方法への関連を通じてcurrent_userを通過し、その後Factory(:post, user: current_user)で工場を呼び出し、次のとおりです。

ので、ポストファクトリを使用スペックに私がしなければなりませんアカウントファクトリ。それを行う方法はありますか?

+0

コード例を追加しますか? –

+0

http://sscce.orgをご覧ください。詳しい情報がなければ、正確な回答は得られません。 –

+0

彼は元のモデルに存在しないアソシエーションを介して属性を渡すことができるかどうかを尋ねています。これは一時属性で行うことができます。あなたが質問を再開するなら、私は答えがあります。 –

答えて

21

使用しているFactoryGirlのバージョンはわかりませんが、最新のバージョン(2.6以降)を使用している場合は、一時的な属性("Getting Started" page)を使用できます。

FactoryGirl.define do 

    factory :post do 
    ignore do 
     user nil 
    end 
    posts_manager { FactoryGirl.build(:posts_manager, :user => user) } 
    end 

    factory :posts_manager do 
    ignore do 
     user nil 
    end 
    account { FactoryGirl.build(:account, :user => user) } 
    end 

    factory :account do 
    user { user } 
    end 

end 

FactoryGirl.create(:post, :user => current_user) 
+1

私はこれを2年前に見つけたと思う。 – stringsn88keys

+3

最近のバージョンのFactoryGirlでは 'ignore'ではなく' transient'を使います –

関連する問題