[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