Rails モデル単体テストのサンプルコード
require 'rails_helper'
RSpec.describe User, type: :model 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
end
context '新規登録できないとき' 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とpassword_confirmationが不一致では登録できない' do
@user.password = '123456'
@user.password_confirmation = '1234567'
@user.valid?
expect(@user.errors.full_messages).to include("Password confirmation doesn't match Password")
end
it 'nicknameが7文字以上では登録できない' do
@user.nickname = 'aaaaaaa'
@user.valid?
expect(@user.errors.full_messages).to include("Nickname is too long (maximum is 6 characters)")
end
it '重複したemailが存在する場合は登録できない' do
@user.save
another_user = FactoryBot.build(:user)
another_user.email = @user.email
another_user.valid?
expect(another_user.errors.full_messages).to include("Email has already been taken")
end
it 'emailは@を含まないと登録できない' do
@user.email = 'test.com'
@user.valid?
expect(@user.errors.full_messages).to include("Email is invalid")
end
it 'passwordが5文字以下では登録できない' do
@user.password = "12345"
@user.password_confirmation = "12345"
@user.valid?
expect(@user.errors.full_messages).to include("Password is too short (minimum is 6 characters)")
end
it 'passwordが129文字以上では登録できない' do
@user.password = Faker::Internet.password(min_length: 129, max_length: 150)
@user.password_confirmation = @user.password
@user.valid?
expect(@user.errors.full_messages).to include("Password is too long (maximum is 128 characters)")
end
end
end
end
注意するところ
「重複したemailが存在する場合は登録できない」について
it '重複したemailが存在する場合は登録できない' do
@user.save
another_user = FactoryBot.build(:user)
another_user.email = @user.email
another_user.valid?
expect(another_user.errors.full_messages).to include('Email has already been taken')
end
生成した@userを保存した後に、再度別のユーザーanother_userを生成
another_userのemailに@userのemailを上書き
another_userが保存されるかどうかを判別する
「passwordが5文字以下では登録できない」について
it 'passwordが5文字以下では登録できない' do
@user.password = '12345'
@user.password_confirmation = '12345'
@user.valid?
expect(@user.errors.full_messages).to include('Password is too short (minimum is 6 characters)')
end
@user.password_confirmationも同じパスワードに上書きするのを忘れずに
passwordが129文字以上では登録できない」について
it 'passwordが129文字以上では登録できない' do
@user.password = Faker::Internet.password(min_length: 129, max_length: 150)
@user.password_confirmation = @user.password
@user.valid?
expect(@user.errors.full_messages).to include("Password is too long (maximum is 128 characters)")
end
@userのpasswordをFakerを使って最短129文字に上書きする
@userのconfirmation_passwordも@user.passwordの値に上書きする
@userが保存されるかどうかを判別する
注意)max_length: 150はエラー回避用。Fakerのデフォルトのmax_lengthは16なので、min_length:129のみだと最小129、最大16という矛盾した設定になりエラーが発生してしまう