初学者です。
テストコードがなぜか大好きです。
Ruby on Railsでテストコードを書く際にFactoryBotとFakerを使うと効率的にできます。
使い方をまとめます。
前提条件
Rspecを導入済みであること
FactoryBot
FactoryBotとは、Railsで利用できるGemです。
FactoryBot用のファイルであらかじめのインスタンスに定める値を設定しておき、各テストコードで使用します。
例えばユーザー登録のテストコードで、ユーザー名やメールアドレスやパスワードをFactoryBotにまとめておくことで効率的に記述をすることができます。
FactoryBot導入
下記のようにGemfile
のgroup :development, :test do
にgem 'factory_bot_rails'
と記述します。
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
gem 'rspec-rails', '~> 4.0.0'
# 以下を追加する
gem 'factory_bot_rails'
end
ターミナルで下記のコマンドを実行しGemを導入します。
bundle install
このあとにテストコードを記述するためのファイルを生成すると、specディレクトリ
配下にfactoriesディレクトリ
とFactoryBot用のファイル(例:users.rbなど)
が生成されますが、既にテストコード用のファイルを生成している場合などは生成されないので手動で作成しても問題ありません。
specディレクトリ
配下にfactoriesディレクトリ
とFactoryBotを記述するためのファイル
を作成します。
例:spec/factories/users.rb
そのファイル内に記述していきます。
FactoryBot.define do
factory :user do
name {'test'}
email {'test@example.com'}
password {'123456'}
password_confirmation {password}
end
end
上記のように記述しておけば、テストコード内で下記のように記述してデータを使い回すことができます。
user = FactoryBot.build(:user)
上記の例ではuser
という変数にFactoryBotのデータを入れているので、例えばuser.name
のように呼び出して使うことができます。
このままでもいいのですが、実際のサービスはユーザーがどんなデータを入れてくるかわからないこともあるのでそれを想定していた方がいいと思います。
そのために使うのがFakerです。
Faker
Fakerとは、Railsで利用できるGemです。
ランダムな値を生成してくれて、人名や住所や電話番号など様々用意されています。
Faker公式Github
アニメの名前とか登場人物とかもあって見てるだけでも面白いです。
ちなみに日本語
のデータがよければgimei
というGemもあります。
例えばバリデーションで日本語のカナじゃないとダメとかにしてる場合はFakerよりもgimeiが使いやすいと思いました。
gimei公式Github
Faker導入
下記のようにGemfile
のgroup :development, :test do
にgem 'faker'
と記述します。
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
gem 'rspec-rails', '~> 4.0.0'
gem 'factory_bot_rails'
# 以下を追加
gem 'faker'
end
ターミナルで下記のコマンドを実行しGemを導入します。
bundle install
先ほどのFactoryBotの内容をFakerを利用したものに変更します。
FactoryBot.define do
factory :user do
name {Faker::Name.initials(number: 2)}
email {Faker::Internet.free_email}
password {Faker::Internet.password(min_length: 6)}
password_confirmation {password}
end
end
書き方は公式のGIthubにも書いてあるのですが
Faker::
の後に指定したいものを選択します。
例えば名前だけでもたくさんあります。
Faker::Name.name #=>フルネームの名前
Faker::Name.first_name #=>firstnameだけ
Faker::Name.initials #=>イニシャル
Faker::Name.initials(number: 2) #=>2文字のイニシャル
基本的に公式に書いてある通りに記述すればOKなので簡単にできます。
コンソールでデータを見ると面白いですよ。
以上です。