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
  1. 生成した@userを保存した後に、再度別のユーザーanother_userを生成

  2. another_userのemailに@userのemailを上書き

  3. 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
  1. @userのpasswordをFakerを使って最短129文字に上書きする

  2. @userのconfirmation_passwordも@user.passwordの値に上書きする

  3. @userが保存されるかどうかを判別する

  4. 注意)max_length: 150はエラー回避用。Fakerのデフォルトのmax_lengthは16なので、min_length:129のみだと最小129、最大16という矛盾した設定になりエラーが発生してしまう

この記事が気に入ったらサポートをしてみませんか?