[Rails]ダミーデータを作る12/20
はじめに
FakerとFactoryBotを使ってダミーデータを作成していきます。
環境:
Rails 6.1.7.3
ruby 3.0.0
Fakerとは
Fakerは、開発やテスト目的で使用される偽のデータを生成するためのRubyのgemです。これにより、テストデータの作成や開発中のサンプルデータの生成など、さまざまな目的に活用することができます。
Fakerはランダムにデータを生成しますが、返される値はデフォルトではユニークであることが保証されていません。一意の値が必要な場合は、明示的にuniqueと指定する必要があります。
seeds.rbとは
seeds.rbは、Railsで初期データを作成するためのファイルです。このファイルに記述されたコードは、データベースに初期データを投入する際に使用されます。通常、開発環境やテスト環境でのデータ作成や、デモデータの準備などに利用されます。
seeds.rbファイルはRailsのdb/seeds.rbに配置されています。
一般的な使い方としては、データモデルを作成し、それに対する属性値を指定してデータベースに保存する処理を記述します。
# ユーザーデータの作成
User.create(name: 'John Doe', email: 'john@example.com', password: 'password')
# 記事データの作成
Post.create(title: 'First Post', body: 'Lorem ipsum dolor sit amet.')
# コメントデータの作成
post = Post.first
post.comments.create(author: 'Jane Smith', body: 'Great post!')
上記の例では、ユーザー、記事、コメントの初期データを作成しています。createメソッドを使用してモデルのインスタンスを作成し、属性値を指定してデータベースに保存しています。
seeds.rbファイルに記述したデータ作成のコードは、以下のコマンドを使用してデータベースに投入することができます:
rails db:seed
このコマンドを実行すると、seeds.rbファイル内のコードが順に実行され、データベースに初期データが作成されます。
インストール
Fakerはdevelopmentとtestどちらの環境にも使用できるようにGemfileにて記載します。
group :development, :test do
gem 'faker'
end
bundle install
seeds.rbを編集する
ユーザーと投稿のダミーデータを作成します。
10.times do
User.creste!(
user_name: Faker::Internet.username
email: Faker::Internet.unique.email
password: 'password',
password_confirmation: 'password'
)
end
20.times do |index|
Article.create!(
user: User.offset(rand(User.count)).first,
title: "タイトル#{index}",
body: "本文#{index}"
)
end
bin/rails db:seed
ダミーデータを作成されたことを確認します。
irb(main):001:0> Faker::Internet.username
=> "tyrone.kuhic"
irb(main):002:0> Faker::Internet.email
=> "elden.sporer@schoen.example"
create!
createはtrueかfalseを返すメソッドなので、userの作成に失敗した場合もエラーを出してくれません。なので、user作成失敗時に例外を発生させるcreate!を選択します。
User.offset(rand(User.count)).first
User.offset(rand(User.count)).first は、ランダムにデータベースの User モデルから1つのレコードを取得するためのコードです。
-
User.countは、データベース内のUserモデルのレコード数を返します。 -
rand(User.count)は、0からUserモデルのレコード数の範囲でランダムな整数を生成します。これによって、ランダムなオフセット値が得られます。 -
User.offset(rand(User.count))は、ランダムなオフセット値を指定してUserモデルのレコードを一つ取得します。 -
firstメソッドは、取得したレコードの中で最初の1つを返します。
FactoryBot
FactoryBotはテストデータの作成を効率化するための便利なツールです。
-
Factoryの定義:FactoryBotで使用するファクトリを定義します。ファクトリはモデルごとに定義され、デフォルトの属性値や関連データなどを指定します。
# 例: Userモデルのファクトリ定義
FactoryBot.define do
factory :user do
name { Faker::Name.name }
email { Faker::Internet.unique.email }
password { 'password' }
end
end
# sequenceを使ってユニークな値を生成する
FactoryBot.define do
factory :user do
name { 'user' }
sequence(:email) { |n| 'user_#{n}#example.com' }
password { 'password' }
password_confirmation { 'password' }
end
end
- テストデータの生成:
FactoryBotを使用してテストデータを生成します。createメソッドを使用するとデータベースに保存され、buildメソッドを使用すると保存されずにインスタンスが作成されます。
# ファクトリからテストデータを生成する例
user = FactoryBot.create(:user)
# or
user = FactoryBot.build(:user)
# name属性を指定してテストデータを生成する例
user = FactoryBot.create(:user, name: 'John Doe')
複数のテストデータを作成することもできます。
-
create_listメソッドを使用する方法:
users = FactoryBot.create_list(:user, 5)
- 繰り返し処理を使用する方法:
5.times do
FactoryBot.create(:user)
end
- 属性のオーバーライドを使用する方法:
5.times do |n|
FactoryBot.create(:user, name: "User #{n+1}")
end
インストール
group :development, :test do
gem 'factory_bot_rails'
end
bundle install
ファクトリーのファイルをモデルごとにデフォルトで作成しない
ジェネレーターを
config.generators do |g|
g.factory_bot false
end
テストケースでテータを作成する
RSpec.describe User, type: :model do
it 'creates a new user' do
user = FactoryBot.create(:user)
# テストコードの残り部分
end
end
FactoryBot.create(:user)を使用して、userモデルのインスタンスを作成しています。FactoryBotはFactoryの定義に基づいて適切なデータを生成し、データベースに保存します。
FactoryBotの省略設定
RSpec.configure do |config|
config.include FactoryBot::Syntax::Methods
end
通常、FactoryBotのデータを呼び出す際は、FactoryBot.create(:user) のような書き方をします。
上記の設定をすることで、先頭に記述しているFactoryBot. を省略してcreate(:user)だけで記述できるようになります。
終わりに
FactoryBotとFakerは異なる役割を持ち、テストデータの生成において補完的な役割を果たします。FactoryBotを使用してデータの構造を定義し、Fakerを使用して具体的なデータの値を生成することで、柔軟かつリアルなテストデータを作成することができますね。
Discussion