私自身の備忘録として簡単にテストコードの実装をここに残しておきます。
前提条件として、今回はユーザーの新規登録の単体テストコードを作成します。
テストする内容はnickname、email、password、password_confirmationの4つをテストします。
gemの準備
まずテストするためのgemをgemfileに記述 ※記述する箇所はgroup :development, :test doの中に記述すること ここに記述するとテストする時にだけ使えるようになるためgroup :development, :test do
gem 'rspec-rails' #この4行を記述、テストするためのgem
gem 'factory_bot_rails' #この4行を記述、テンプレート的なやつを作るgem
gem 'faker' #この4行を記述、テキトーな文字列などを入れてくれるgem
gem 'pry-rails' #この4行を記述、binding.pryで処理を止めれるようにするgem
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
上記の記述をしたら以下をターミナルで実行
% bundle install
% rails g rspec:install
これらのファイルが作成されたら完璧
create .rspec
create spec
create spec/spec_helper.rb
create spec/rails_helper.rb
.rspecのファイルに以下を記述
--require spec_helper #デフォルトで入ってる
--format documentation #この行を追加
この記述は、テストコードの結果をターミナル上に可視化するための記述です。
モデルの準備
以下のコマンドでモデルの作成をします(今回はuserモデルを作成)
% rails g rspec:model user
これらが作成されたらおk
create spec/models/user_spec.rb
invoke factory_bot
create spec/factories/users.rb
テスト内容の洗い出し
require 'rails_helper'
RSpec.describe User, type: :model do
describe "ユーザー新規登録" do
it "nicknameが空では登録できない" do
# nicknameが空では登録できないテストコードを記述します
end
it "emailが空では登録できない" do
# emailが空では登録できないテストコードを記述します
end
it "passwordが空では登録できない" do
# passwordが空では登録できないテストコードを記述します
end
it "password_confirmationが空では登録できない" do
# password_confirmationが空では登録できないテストコードを記述します
end
end
end
かる〜く解説知ってたらスルーしてよし
①describe "行いたいテストの内容" do〜end
"行いたいテストの内容"のなかに内容を記述、今回はユーザー管理機能のテストを記述
②it '条件'do〜end
'条件'の部分にテストしたい条件を記述
ちゃんとできてるか確認するためにコマンドを実行
% bundle exec rspec spec/models/user_spec.rb
これがターミナルに出力されたらおk
FactoryBotとFakerを使う
まずspecのディレクトリの中にfactoriesと言うディレクトリを作り、その中にuser.rbを作成する
作成したusers.rbに以下を記述
FactoryBot.define do
factory :user do
nickname {"test"}
email {"test@example"}
password {"000000"}
password_confirmation {password}
end
end
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
これでfactorybotの準備完了!
①user_spec.rbのファイルに戻ってRSpec.describe User, type: :model doの下に以下の3行を追加
②it do〜endの処理の中に実際行う処理をそれぞれ記述する
require 'rails_helper'
RSpec.describe User, type: :model do
#⬇︎この3行を追加
before do
@user = FactoryBot.build(:user)
end
#⬆︎この3行を追加
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
it "passwordが空では登録できない" do
@user.password = ""
@user.valid?
expect(@user.errors.full_messages).to include("Password can't be blank")
end
it "password_confirmationが空では登録できない" do
@user.password_confirmation = ""
@user.valid?
expect(@user.errors.full_messages).to include("Password confirmation doesn't match Password")
end
end
end
実行しましょう!
% bundle exec rspec spec/models/user_spec.rb
これらが表示されたらおk
もしエラーが出てしまうならエラー箇所にbinding.pryを記述し実行しましょう!
it "nicknameが空では登録できない" do
@user.nickname = ""
@user.valid?
binding.pry #ここで処理が止まる
expect(@user.errors.full_messages).to include("Nickname can't be blank")
end
※処理を止めてエラーの内容を確認する手順は以下の通りです
pry(#<RSpec::ExampleGroups::User>)> @user.valid? #エラーが出ているかの確認
pry(#<RSpec::ExampleGroups::User>)> @user.errors.full_messages #エラーメッセージの確認
pry(#<RSpec::ExampleGroups::User>)> exit #railsコンソールから脱出