はじめに
今回でテストコードについては最後の投稿になります。
前回までの投稿はこちら↓
①🔰【初学者用】RSpecでテストコードを書こう!【概念・準備】
②🔰【初学者用】RSpecでテストコードを書こう!②【簡単な実装例】
③🔰【初学者用】RSpecでテストコードを書こう!③【コントローラーの単体テスト簡単な実装例】
🔰【初学者用】RSpecでテストコードを書こう!④【結合テストの簡単な実装例】
# FactoryBot
テストコードを書く際に、user = User.new(nickname: '', email: 'test@example', password: '000000', password_confirmation: '000000')
のような形でユーザーを生成する記述を都度記述していくのは大変ですよね。
そういう時に役立つのがFactoryBot
というGem
になります。
まずは導入から!
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
group :development, :test do
内に記述します!
bundle install
もお忘れなく!
次にFactoryBotの内容を記述するfactories
ディレクトリをspecディレクトリ内に作成します(手動でOK)。加えて、factriesディレクトリの中にusers.rbファイル
を作成します。(今回はuserにしてますが、投稿であればpost.rbのように、その都度変えてください。)
FactoryBot内に記述していきます。
FactoryBot.define do
factory :user do
nickname {'test'}
email {'test@example'}
password {'000000'}
password_confirmation {password}
end
end
続いてここで作成した記述をテストコードに反映させます。
require 'rails_helper'
RSpec.describe User, type: :model do
before do
@user = FactoryBot.build(:user)
end
describe 'ユーザー新規登録' do
it 'nicknameが空では登録できない' do
@user.nickname = ''
@user.valid?
expect(@user.errors.full_messages).to include "Nickname can't be blank"
end
it 'emailが空では登録できない' do
@user.email = ''
@user.valid?
expect(@user.errors.full_messages).to include "Email can't be blank"
end
end
end
3〜5行目のように記述することでspec/factories/users.rb
内で記述した内容がspec/models/user_spec.rb
ファイルにも生成されます。
before do
@user = FactoryBot.build(:user)
end
build
buildはActiveRecordのnewメソッドと同様の意味を持ちます。
つまりFactoryBot.build(:user) = user = User.new(nickname: 'test', email: 'test@example', password: '000000', password_confirmation: '00000000')ということ。これを見れば、どちらが効率的か明確ですね!笑
Faker
続いてランダムな値を出力する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
忘れずbundle install
先程記述したspec/factories/users.rbを編集します!
FactoryBot.define do
factory :user do
nickname {Faker::Name.initials(number: 2)}
email {Faker::Internet.free_email}
password {Faker::Internet.password(min_length: 6)}
password_confirmation {password}
end
end
Fakerはランダムな値を生成してくれます。メールアドレス、人名、パスワードなど、さまざまな意図に応じたランダムな値を生成してくれます。他にもたくさん使い道はあるので調べてみましょう!
記入を終えたら下記コマンドでテストを実行してください。
bundle exec rspec spec/models/user_spec.rb
終わりに
①〜⑤に渡りテストコードの簡単な使い方をまとめました。もっと深ぼらなければならない部分はたくさんありますが、簡単な流れだけは分かるのではないかと思います!
それではまた。