kouの技術的メモ

学習した内容の定着やアウトプット用に開設しました

成果物の作成2作品目⑧ 予定管理サービス  コントローラのbeforeアクションの追加、全体のテスト実装

今回は細かいバグを取り除くために、コントローラのbeforeアクションとテストを書いていこうと思います。

minitestを使っています。

beforアクションの追加

今のままだと未ログイン状態でも誰がログインしていようと、お構いなしにいろんなURLにアクセスできてしまうので、

各コントローラに before_action制限をかけます

app/controllers/users_controller.rb

  before_action :logged_in_user, only: [:index,:show, :destroy]
  before_action :correct_user,   only: :destroy 

/schedule/app/controllers/schedule_controller.rb

  before_action :logged_in_user, only: [:show,:new, :destroy,:create]
  before_action :correct_user,   only: :destroy      

/schedule/app/controllers/time_schedules_controller.rb

  before_action :logged_in_user, only: [:new,:create]
  before_action :correct_user,   only: [:new,:create]

テストの追加

テストを完成させていこうと思います。

Userモデル、DayScheduleモデル、TImeScheduleモデルの種類があるので、それぞれフィクスチャーを作成しました。

モデル

全部載せると長すぎるので、とりあえずUserモデルのみ掲載します。

/schedule/test/models/user_test.rb

require 'test_helper'

class UserTest < ActiveSupport::TestCase
  
  def setup
    @user = users(:user)
  end
  
  test "サニティーチェック" do
    assert @user.valid?
  end
  
  test "user_nameのバリデーションが機能するか" do
    @user.user_name = "     "
    assert_not @user.valid?
  end
  
  test "uidのバリデーションが機能するか" do
    @user.uid = ""
    assert_not @user.valid?
  end
  
  test "providerのバリデーションが機能するか" do
    @user.provider = ""
    assert_not @user.valid?
  end
  
  
  test "Userモデルが削除されると紐付いているDayScheduleモデルも同時に削除されるか" do
    @user.save
    @user.day_schedule.create!(day_schedule: "test")
    assert_difference 'DaySchedule.count', -1 do
      @user.destroy
    end
  end
end
コントローラ
require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
  
  def setup
    @user = users(:user)
  end

  test "未ログイン状態でユーザ一覧ページにgetアクセスするとログインページにリダイレクトれるか" do                            
    get users_path                                                              
    assert_redirected_to root_url
  end
  
  test "未ログイン状態でユーザーページにgetアクセするときちんとログインページにリダイレクトされるか。" do                            
    get user_path(@user)
    assert_redirected_to root_url 
  end
  
  test "未ログイン状態でユーザ情報を削除するときちんと失敗するか" do           
    assert_no_difference 'User.count' do                                        
      delete user_path(@user)                                                   
    end
    assert_redirected_to root_url                                               
  end
end

結果はグリーンです!

手動テストでも動作は大丈夫でした。

今回はインテグレーションテストまではできませんでしたが、次回完成まで持っていきたいと思います。