読者です 読者をやめる 読者になる 読者になる

Factorygirlのモデルの関連付けのやり方

Factorygirlで関連付けしたモデルのテストを行いたい時があります。

そこで、Factorygirlのモデルで関連付けする方法になります。

Userモデルに対して、Postモデルが属するという関係です。

Userモデル

class User < ActiveRecord::Base
  has_many posts
end

Postモデル

class Post < ActiveRecord::Base
  belongs_to user
end

まずはFactorygirlのUserモデルを見てみましょう。

FactoryGirl.define do
  factory :user do
    factory :mikami do
      name 'mikami'
    end
  end
end

次に、FactorygirlのPostモデルになります。

FactoryGirl.define do
  factory :post do
    factory :cat do
      content '我輩は猫である'
      association :user, factory: :mikami
    end

    factory :dog do
      content '我輩は犬である'
      association :user, factory: :mikami
    end

    factory :cattle do
      content '我輩は牛である'
      association :user, factory: :mikami
    end

    factory :human do
      content '我輩は我輩である'
      association :user, factory: :mikami
    end
  end
end

まず、関連付けはassociation :user, factory: :michaelという風に、「モデル名」「該当するfactory(ここではmikami)」とすることで、関連付けができます。

ただし、ここで注意したいのは単純にFactorygirlでmikamiを作成した時に、関連付けは行われません。

@user = create(:mikami)

関連付けを同時に生成する場合は、次のようにします。

FactoryGirl.define do
  factory :user do
    factory :mikami do
      name 'mikami'

      after(:create) do |user|←これを書くことで、生成時に関連付けを行ってくれる
        create :cat, user: user
        create :dog, user: user
        create :cattle, user: user
        create :human, user: user
      end
    end
  end
end

これで関連付けが行われます。