【FactoryBot】associationの使い方
前提条件
以下を前提条件に話を進めていきます。
①以下のテーブルが存在する。
※Railsで自動で生成されるカラムは一部省略しています。
users :ユーザーテーブル
posts:ユーザーのつぶやきを保存するテーブル
goods:いいね機能のテーブル
②Railsの関連が定義済みであること。
associationとは
関連するデータを一緒に作成してくれるメソッド
例えばpostsテーブルのテストデータを作成する時に、必ずusersのデータが必要になる。
この時associationを使わない方法でテストデータを作成すると以下のようになる。
# モデルテスト
RSpec.describe Post, type: :model do
let(:user) { FactoryBot.create(:user) }
let(:post) { FactoryBot.create(:post, user_id: user.id) }
end
このようにuserとpostの両方のテストコードを記述しなければならない。
二つだけならまだいいが、さらに関連するテーブルが増えていくと記述するのが大変。
これを解決するのがassociationメソッド。
使い方
①factoryにassociationを記述
# ポストファクトリー
FactoryBot.define do
factory :post do
association :user
# factory名が違う場合以下のように記述する
# association :user, factory: :tom
end
end
②specにてデータを作成する
RSpec.describe Post, type: :model do
let(:post) { FactoryBot.create(:post) }
end
これでpostデータ作成と同時にuserデータも作成される。
さらにpostのuser_idも自動でidが入る。
associationで作成するデータが被ってしまう場合
例えばgoodデータを作成する時、以下のようにするとuserデータが二つ作られてしまう。
FactoryBot.define do
factory :good do
# postには「association :user」が宣言されているため
# userのデータが二つ作られることになる。
association :post
association :user
end
end
解決方法
これを解決するにはpostで作成されたuserを使えばいい。
FactoryBot.define do
factory :good do
association :post
user { post.user }
end
end
まとめ
associationとは関連するデータを同時に作成するメソッド
これを使うとコードがスッキリする
ここまでご覧いただきありがとうございました。
Author And Source
この問題について(【FactoryBot】associationの使い方), 我々は、より多くの情報をここで見つけました https://qiita.com/Ryoga_aoym/items/741c57e266a9d811a2d4著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .