Dai

【RSpec-rails】ユーザーモデル単体テストコード

はじめにrspec-railsfactory_bot_railsfakerを導入する

# Gemfile

group :development, :test do
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  gem 'faker'
end

ターミナル$ bundle installrails g rspec installを行う。作成された.rspecファイルに--format documentation(表示の出力がきれいになるようにフォーマットを指示する)を記述

--format option Use the --format option to tell RSpec how to format the output.

RSpec ships with a few formatters built in. By default, it uses the progress formatter, which generates output like this:

仕様に沿ったユーザーモデルのデータを設定する

重複したemailは登録できないことにしているため、uniqueを付けて一意となるようにする

# spec/factories/users.rb

FactoryBot.define do
  factory :user do
    email { Faker::Internet.unique.free_email }
    password { '123456' }
    password_confirmation { password }
  end
end

factory_botを使う

インスタンス編集@userに、先程設定したuserのデータを入れる

# spec/models/user_spec.rb

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

createアクションをテストする。テスト項目を書き出す

# spec/models/user_spec.rb

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

    it 'email, password, password_confirmationが存在すれば登録できること' do
    end

    it 'emailが空では登録できないこと' do
    end

    it '重複したemailが存在する場合登録できないこと' do
    end

    it 'emailには@が含まれてなければ登録できないこと' do
    end

    it 'passwordが空では登録できないこと' do
    end

    it 'passwordが6文字以上であれば登録できること' do
    end

    it 'passwordが5文字以下では登録できないこと' do
    end

    it 'password_confirmationが必須であること' do
    end
  end
end

洗い出した項目を検証するためのコードを書く

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

    it 'emailが空では登録できないこと' do
      @user.email = ''
      @user.valid?
      expect(@user.errors.full_messages).to include("Email 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 'emailに@が含まれていなければ登録できないこと' do
      @user.email = 'sample.com'
      @user.valid?
      expect(@user.errors.full_messages).to include('Email is invalid')
    end

    it 'passwordが空では登録できないこと' do
      @user.password = ''
      @user.valid?
      expect(@user.errors.full_messages).to include("Password can't be blank")
    end

    it 'passwordが6文字以上であれば登録できること' do
      @user.password = "123456"
      expect(@user).to be_valid
    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_confirmationが空では登録できないこと' do
      @user.password_confirmation = ''
      @user.valid?
      expect(@user.errors.full_messages).to include("Password confirmation doesn't match Password")
    end
  end
end

テストコードを実行する

# spec/models/user_spec.rbの実行

$ bundle exec rspec spec/models/user_spec.rb

【rails】RSpecの基本構造

RSpecの基本


基本構造

RSpec.describe "説明の対象を記述" , type: :対象のタイプ do
  it "何を説明するか" do
    "テスト"
  end
end



Userモデルを説明の対象とする場合

#spec/models/user_spec.rb

RSpec.describe "User" , type: :model do
  it "何を説明するか" do
  end
end



describeはネストも可能であるためグループを分けられる、Userモデルのcreateアクションとfindアクションを対象とする場合

#spec/models/user_spec.rb

RSpec.describe "User" , type: :model do
  describe "#create" do
      it "何を説明するか" do
      end
  end
  describe "#find" do
    it "何を説明するか" do
    end
  end
end


contextと条件を分ける。Userの結合テストの場合

RSpec.describe 'Users', type: :system do
  context 'ユーザー新規登録ができるとき' do
  end
  context 'ユーザー新規登録ができないとき' do
  end
end


RSpec公式サイト github.com

【rails RSpec】単体・結合テストコードの準備をする。必要なgemの導入とインストール

RSpecのインストール

gemの導入

1.gem rspec-rails
2.gem capybara -ブラウザを再現するのに必要なgem。railsでは、デフォルトでインストールされているため今回は記述不要

今回、テストコードは開発中にのみ使うため、本番環境のproductionを除くdevelopment環境test環境の両方でインストール

Gemfileに必要なgemを記述

group :development, :test do
  gem 'rspec-rails'  

  #バージョンの指定をするなら
  gem 'rspec-rails' '~>4.0.0'
end


次に、bundle installをしてgemfile内に記述されたgemをすべてインストール

$ bundle install



公式サイトより

(Adding it to the :development group is not strictly necessary, but without it, generators and rake tasks must be preceded by RAILS_ENV=test.)

厳密にはdevelopment環境に追加する必要はないが、その場合、generatorsrakeの前にRAILS_ENV = testを付ける必要があるとのこと。

RSpec用の設定ファイルを生成する
$ rails g rspec:install
     create  .rspec
     create  spec
     create  spec/spec_helper.rb
    create  spec/rails_helper.rb

以上でrspecの導入完了



rspec-rails公式サイト github.com

【rails】【 gem devise】の導入手順とよく使う便利なメソッドたち。Railsアプリでユーザー管理機能(新規登録・ログイン機能)の実装の準備をする。

devise導入の手順

Gemfileでgem 'devise'と記入し、ターミナルでbundle installとしてdeviseのgemを導入する


まだdeviseが使えない状態なので、ターミナルでインストールする
% rails g devise:install
userモデルの生成
% rails g devise user
ビュー画面のカスタマイズをする場合
% rails g devise:views
controllerを使ってカスタマイズしたい場合

usersコントローラーの作成

% rails generate devise:controllers users

 

deviseで使える便利なメソッドたち

ログインの有無

user_signed_in?

ログイン中のユーザー

current_user

ログインユーザーのみ許可するメソッド

before_action :authenticate_user!

deviseのusersテーブルに追加するカラムの許可

first_nameとlast_nameの許可

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name])
  end
end


詳しくは公式↓ github.com

テスト準備 mac-san.hatenablog.com


ユーザーモデルの単体テストコード mac-san.hatenablog.com