はじめに
Rspecというgemを用いてテストコードを実装しました。
今回はユーザー登録機能の単体テストコードについて、正常系と異常系の挙動の確認を行いました。
目次
1必要なgemの導入
2FactoryBotの記述
3テストコードの記述
1. 必要なgemの導入
gemfileのgroup :development, :testの中に、以下を追記します。
その後、bundle installを実行します。
gem 'pry-rails'
gem 'rspec-rails'
gem 'factory_bot_rails'
gem 'faker'
次に、Rspecを書くためのディレクトリを作成します。
ターミナル
rails g rpsec:install
実行すると、以下のようにディレクトリとファイルが生成されます。
ターミナル
create .rspec
create spec
create spec/spec_helper.rb
create spec/rails_helper.rb
テストコードの結果をターミナル上で確認するための記述をします。
--format documentation
2. FactoryBotの記述
FactoryBotとはインスタンスをまとめておくことができるgemです。
specディレクトリにfactoriesディレクトリを作成し、その中にuser.rbファイルを作成します。
user.rbを以下のように編集します。
FactoryBot.define do
factory :user do
nickname { Faker::Name.last_name }
email { Faker::Internet.free_email }
password = Faker::Internet.password(min_length: 6)
password { password }
password_confirmation { password }
end
end
Fakerはランダムな値を生成するgemです。
3. テストコードの記述
spec/models/user_spec.rbを以下のように編集します。
require 'rails_helper'
RSpec.describe User, type: :model do
describe User do
before do
@user = FactoryBot.build(:user)
end
describe 'ユーザー新規登録' do
context '新規登録がうまくいくとき' do
it 'nicknameとemail、passwordとpassword_confirmationが存在すれば登録できること' do
expect(@user).to be_valid
end
it 'passwordが6文字以上あれば登録できること' do
@user.password = '123456'
@user.password_confirmation = '123456'
expect(@user).to be_valid
end
end
context '新規登録がうまくいかないとき' do
it 'nicknameが空では登録できないこと' do
@user.nickname = nil
@user.valid?
expect(@user.errors.full_messages).to include('ニックネームを入力してください')
end
it 'emailが空では登録できないこと' do
@user.email = nil
@user.valid?
expect(@user.errors.full_messages).to include('Eメールを入力してください')
end
it '重複したemailが存在する場合登録できないこと' do
@user.save
another_user = FactoryBot.build(:user, email: @user.email)
another_user.valid?
expect(another_user.errors.full_messages).to include('Eメールはすでに存在します')
end
it 'passwordが空では登録できないこと' do
@user.password = nil
@user.valid?
expect(@user.errors.full_messages).to include('パスワードを入力してください')
end
it 'passwordが存在してもpassword_confirmationが空では登録できないこと' do
@user.password_confirmation = ''
@user.valid?
expect(@user.errors.full_messages).to include('パスワード(確認用)とパスワードの入力が一致しません')
end
it 'passwordが5文字以下であれば登録できないこと' do
@user.password = '12345'
@user.password_confirmation = '12345'
@user.valid?
expect(@user.errors.full_messages).to include('パスワードは6文字以上で入力してください')
end
end
end
end
end
以下のコマンドでテストコードを実行します。
ターミナル
bundle exec rspec spec/models/user_spec.rb
今回は、'rails-i18n’を用いているためエラーメッセージが日本語表記になっています。
pry-railsというgemを用いることで、テストコードの実行を途中で止め、エラーメッセージの確認を行なっています。
参考リンク
https://github.com/rspec/rspec-rails
https://github.com/faker-ruby/faker