web-dev-qa-db-ja.com

FactoryGirlのアソシエーションチェーンを介してパラメーターを渡す方法

デフォルトでは、FactoryGirlはアソシエーションのファクトリを呼び出してそれらを作成します。ファクトリの関連付けをパラメータとして渡すことができます。しかし、アソシエーションチェーンの奥深くで使用する必要があるオブジェクトをどのように渡すことができますか?

例えば:

Current_userに属するAccountを持つPostsManagerを持つPostがあります。

Factory(:post)を実行すると、PostsManagerが作成され、(stubed)current_userに属していないアカウントが作成されます。

したがって、Postファクトリを使用する仕様では、次のことを行う必要があります。

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

私がやりたいのは、Factory(:post, user: current_user)を使用してファクトリを呼び出し、_current_user_を関連付けを介してアカウントファクトリに渡すことです。そうする方法はありますか?

23
JoaoHornburg

使用しているFactoryGirlのバージョンはわかりませんが、最近のバージョン(2.6以降)を使用している場合は、一時属性を使用できます(詳細については、 「はじめに」ページ を参照してください)。あなたはこのようなことをすることができます:

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)
23
Jacob Brown