1
/
5

【rails】FactoryBotでテストデータを柔軟に作成する【株式会社ライトコード】

はじめに

今回はテストデータを作成するためのgem「FactoryBot」の使い方を解説したいと思います。
本記事は、機能面についてを重点的に紹介するため導入方法については省略させていただきます。

基本的な定義方法

userモデルが、「name, email」を持つ場合以下のような定義になります。
データ名と対応する値を「{}」に中に設定します。

FactoryBot.define do

factory :user do
name {'田中太郎'}
email {'test@example.com'}
end
end

シーケンス

emailなどに一意制約がある場合は以下のようにシーケンスを使用することで、毎回異なるemailを作成することができます。

sequence :email do |n|

"test#{n}@example.com"
end

# 結果:test1@example.com
省略記法
sequence(:email) { "test#{_1}@example.com" }


# 結果:test1@example.com
初期値設定
sequence(:email, 1000) { |n| "test#{n}@example.com" }


# 結果:test1000@example.com

アソシエーション

userモデルとpostモデルが「1対多」の関係と仮定します。
親モデルのuserのfactory名を指定するだけで、関連付けをすることができます。
postモデルのテストデータを作成すると自動的にuserモデルのテストデータも作成されます。

FactoryBot.define do

factory :post do
...
user
end
end
別の書き方
FactoryBot.define do

factory :post do
...
association :user
end
end

factoryを指定したり、属性を上書きすることもできます。

FactoryBot.define do

factory :post do
...
association :author, factory: :user, name: '鈴木太郎'
end
end

ファクトリーを指定することで、以下のようにモデルの関連付けで、「user」ではなく「author」のように別名で関連付けをしている場合などでも関連付けができるようになります。

belongs_to :author, class_name: 'User', foreign_key: 'user_id'

実際にデータ生成する際にアソシエーションを上書きすることもできます。

yamada = build(:user, name: '山田太郎')

post = build(:post, author: yamada)

親モデル生成時に子モデルのデータを同時に生成したい時

子モデルのデータ生成には、「afterコールバック」が使えます。
userデータを作成後にコールバック内の処理を実行してくれます。
その時「第一引数」に「親モデル」「第二引数」で「transient」のデータにアクセスすることができます。
transient」は色んな値を格納できる便利な変数みたいなイメージで良いかと思います。
transient」に設定した値に応じて、子モデルのデータを柔軟に作成することができます。

FactoryBot.define do

factory :user do
transient do
post_datas {
[
{category: 'sports', comment: 'スポーツに関するコメントです'},
{category: 'technology', comment: 'テクノロジーに関するコメントです'},
{category: 'music', comment: '音楽に関するコメントです'},
]
}
end

...

after(:create) do |user, evaluator|
evaluator.post_datas.each do |data|
create(:post, category: data[:category], comment: data[:comment], author: user)
end
end
end
end

### 以下のようにuserを作成すると
user = FactoryBot.create(:user)
### postモデルのデータが作成される
user.posts.map(&:category)
=> ["sports", "technology", "music"]

「子モデルが持つデータはデフォルトの内容で良いから、指定の数だけ作成したい」といった場合には「create_list」が使えます。
第二引数に件数を指定することで、件数分の子モデルのデータが作成されます。

after(:create) do |user|

create_list(:post, 3, author: user)
end

またこの後紹介する「trait」にafterコールバックを指定してあげれば「trait」を指定した時のみ子モデルのデータを作成することもできます。

trait :posts_create do

after(:create) do |user, evaluator|
evaluator.post_datas.each do |data|
create(:post, category: data[:category], comment: data[:comment], author: user)
end
end
end

trait

「trait」はコールバック処理や一部のデータの値をラップして、factoryと一緒に呼び出すことでfactoryにtraitで定義した内容を結合する機能を持ちます。

記事の続きは下のURLをクリック!

https://rightcode.co.jp/blogs/49108



エンジニア積極採用中です!

現在、WEBエンジニア、モバイルエンジニア、デザイナー、営業などを積極採用中です!

採用ページはこちら:https://rightcode.co.jp/recruit

社員の声や社風などを知りたい方はこちら:https://rightcode.co.jp/blogs?category=life

社長と一杯飲みながらお話しませんか?(転職者向け)

特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk

もっとワクワクしたいあなたへ

現在、ライトコードでは「WEBエンジニア」「モバイルエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「営業」などを積極採用中です!

ライトコードは技術力に定評のある受託開発をメインにしているIT企業です。

有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。

  • もっと大きなことに挑戦したい!
  • エンジニアとしてもっと成長したい!
  • モダンな技術に触れたい!

現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?

ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。

  • ライトコードの魅力を知っていただきたい!
  • 社風や文化なども知っていただきたい!
  • 技術に対して熱意のある方に入社していただきたい!

一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。

Invitation from 株式会社ライトコード
If this story triggered your interest, have a chat with the team?
株式会社ライトコード's job postings

Weekly ranking

Show other rankings
Like Hiroyuki Choshi's Story
Let Hiroyuki Choshi's company know you're interested in their content