（異常系）Rspec Userモデルの単体テストの手順





今回は異常系テストについて書いていきます。
前回はこちら:point_down_tone1:

その①[Rspec Userモデルの単体テストの手順](https://qiita.com/wwaattaa/items/1b24fbfece296aaf4a71)
その②[（正常系）Rspec Userモデルの単体テストの手順](https://qiita.com/wwaattaa/items/1b24fbfece296aaf4a71)




Userモデルの正常系テストについて書いていきます。　
ここではバリデーションに関するテストを実装致します。


*異常系テスト*とは、
対象が想定外のことを起こして、きちんと対処できるか確認する作業

正常系テストがユーザーが開発者の意図する操作を行った時の
挙動を確認するテストコードならばその逆。
開発者の意図しない操作を行った場合の挙動を調べます！


正常系テストがうまくいったときで
異常系テストがうまくいかなかったときですね。


雛形
=====



```ruby:spec/models/user_spec.rb
require 'rails_helper'
describe User do
  before do
    @user = FactoryBot.build(:user)
  end

  describe 'ユーザー新規登録' do
    context '新規登録がうまくいくとき' do
      it "nicknameとemail、passwordとpassword_confirmationが存在すれば登録できる" do
      end
      it "nicknameが6文字以下で登録できる" do
      end
      it "passwordが6文字以上であれば登録できる" do
      end
    end

    context '新規登録がうまくいかないとき' do
      it "nicknameが空だと登録できない" do
      end
      it "nicknameが7文字以上であれば登録できない" do
      end
      it "emailが空では登録できない" do
      end
      it "重複したemailが存在する場合登録できない" do
      end
      it "passwordが空では登録できない" do
      end
      it "passwordが5文字以下であれば登録できない" do
      end
      it "passwordが存在してもpassword_confirmationが空では登録できない" do
      end
    end
  end
end

```


テストコードの記述
--------
be_validマッチャを使用します。
itとendの中に記述していきます。（正常系と一緒）


expectのインスタンスが正しく保存されることを確認できます。
expect(インスタンス).to be_validのように使用してください。


```ruby:spec/models/user_spec.rb

require 'rails_helper'
describe User do
  before do
    @user = FactoryBot.build(:user)
  end

  describe 'ユーザー新規登録' do
    context '新規登録がうまくいくとき' do
      it "nicknameとemail、passwordとpassword_confirmationが存在すれば登録できる" do
      end
      it "nicknameが6文字以下で登録できる" do
      end
      it "passwordが6文字以上であれば登録できる" do
      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 '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 'nicknameが空では登録できない' do
      @user.nickname = ''
      @user.valid?
      expect(@user.errors.full_messages).to include("Nickname can't be blank")
     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 'passwordが空では登録できない' do
       @user.password = ''
       @user.valid?
       expect(@user.errors.full_messages).to include("Password can't be blank")
       end

      it 'passwordが5文字以下では登録できない' do
       @user.password = '00000'
       @user.password_confirmation = '00000'
       @user.valid?
      expect(@user.errors.full_messages).to include('Password is too short (minimum is 6 characters)')
      end

      it 'passwordとpassword_confirmationが不一致では登録できない' do
       @user.password_confirmation = ''
       @user.valid?
       expect(@user.errors.full_messages).to include("Password confirmation doesn't 
match Password")
     end
    end
  end
end


```



それと単体テストで気をつけてほしいのは、endの数
doとendの数は同じ分あります。
doの数が１０ならばendの数も１０あります。一つend抜けるとエラーになってしまうので要注意です。



validは日本語で「正しい」を意味します。
valid?とすることで「正しいかどうか」を判定するメソッドとなります。
作成したデータが正しく保存される場合はtrueを、保存されない場合はfalseを返します。
また、保存されない場合は「なぜ保存されないのか」のエラーメッセージも生成します。

もし、エラーメッセージが出てきたらbinding.pryを用いて確認します！。