【Rails6】 RSpecによる管理者(admin)機能のモデル単体テストの実装

#はじめに
サービスの品質を保つために必要不可欠なテストを実施しております。
今回は管理者権限の機能のテストを行っております。

今後も他のモデルについても実施し記事にしていきたいと思います。

なお、usersテーブルにadminカラムを含めております。

#記事の紹介
よろしければご参考ください。

①以下Userモデルの単体テストコードの内容は以下の記事に記載しております。

https://qiita.com/narimiya/items/8ec3cdc15b1134b04dce

②管理者機能の実装の記事は以下に記載しております。

https://qiita.com/narimiya/items/8d21b18db9c75b1dde2d

#前提

・以下のgemはインストール済み

```Gemfile
  gem 'rspec-rails', '~> 4.0.0'
  gem 'factory_bot_rails'
  gem 'faker'
```

・管理者機能は実装済み

#バージョン
rubyのバージョン　ruby-2.6.5
Railsのバージョン Rails:6.0.0
rspec-rails 4.0.0

#実施したテスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/c3f0f9ec-5999-da40-0c97-c376832d390f.png)


##usersテーブルのadmin

```xxxx_devise_create_users.rb

class DeviseCreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
     
#〜省略〜

      t.boolean :admin,                default: false

#〜省略〜
```

##モデル内のバリデーション

```app/models/user.rb

#〜省略〜

  validates :admin, exclusion: {in: [true], message: "システムエラー：不正な値が入力されました"}

#〜省略〜

```

##FactoryBotの内訳

```spec/factories/users.rb

#〜省略〜

    admin                           {Faker::Boolean.boolean(true_ratio: 0.2)}

#〜省略〜

```

##テストコードの内容

```spec/models/user_spec.rb
require 'rails_helper'

RSpec.describe User, type: :model do
  before do
    @user = FactoryBot.build(:user)
  end


#〜省略〜

    describe 'adminのバリデーション' do
        context 'adminが登録される' do
          it "adminの値が空欄の場合" do
            @user.admin = nil
            expect(@user).to be_valid
          end
          it "adminの値がfalseの場合" do
            @user.admin = false
            expect(@user).to be_valid
          end
        end
        context 'adminの登録がうまくいかないとき' do
          it "adminの値がtrueの場合" do
            @user.admin = true
            @user.valid?
            expect(@user.errors.full_messages).to include("Adminシステムエラー：不正な値が入力されました")
          end
        end
    end


#〜省略〜

```

#補足説明
##boolean型について
usersテーブルで使用しているbooleanについてです。
boolean型とはtrueまたはfalseの真偽値を判断する型です。

管理者機能では「trueかfalseか」をboolean型で管理します。
すなわち、userが管理者か否かの判別をつけることができます。

```spec/factories/users.rb
 t.boolean :admin,                default: false
```

したがって、複数の管理者を選択することも可能です。

##adminのtrueとfalseについて
管理者権限を与えたいユーザーに対し、adminの値をtrueとしています。

true 　→　管理者
false　→　管理者ではない

##exclusionについて
含まないことを検証する場合に使用します。
今回はadminがtrueということを除外しています。
すなわち、adminはfalseの状態です。

```app/models/user.rb
  validates :admin, exclusion: {in: [true], message: "システムエラー：不正な値が入力されました"}
```

##Faker::Boolean.boolean(true_ratio: 0.2)について
今回はテスト上、adminをfalseの状態で進めたいです。

そこで以下のadminに関するFakerを使用しています。

```spec/factories/users.rb
    admin                           {Faker::Boolean.boolean(true_ratio: 0.2)}
```

##Faker::Boolean.booleanの種類について
真偽値において、trueもしくはfalseで進める際、場合分けができます。

```
Faker::Boolean.boolean #true

Faker::Boolean.boolean(true_ratio: 0.2) #false
```

単にtrue、falseで設定しても問題ありません。

##テストコードの内容について
adminは本来seeds.rbにて初期データをセットしておりますので、本来登録はされません。
その登録をされないことのテストを実施しております。

異常　→　【adminが登録される】場合
・adminの値が空欄の場合
・adminの値がfalseの場合

正常　→　【adminの登録がうまくいかない】場合
・adminの値がtrueの場合" do
           
##補足
adminは登録するされる場合以外にも、たくさんあります。

・displayが表示されるか
・投稿が閲覧できるか
・投稿が削除できるか
・ユーザー情報を閲覧できるか
・ユーザー情報を削除できるか などなど

正常、異常の場合を洗い出し、テストを行い品質を担保する必要があります。

以上です。