Closed5

devise_token_auth × minitestの認証周りテスト方法

ぐりこぐりこ

概要

  • devise_token_authを使って認証を共通処理として実装した。これを継承したコントローラテストを書きたいがどうやってやればいいんだろう?🤔
# frozen_string_literal: true

module Admin
  class BaseController < ::ApplicationController
    include DeviseTokenAuth::Concerns::SetUserByToken
    before_action :authenticate_user!
    ...
  end
end

module Admin
  class HogesController < ::Admin::BaseController
    def index
    # こいつのテストが書きたい
    end
    ...
  end
end
ぐりこぐりこ

Gemのバージョン

devise (4.9.2)
devise_token_auth (1.2.2)
minitest (5.18.0)

ぐりこぐりこ

ダミーデータ作成の仕方はこんな感じ。userから取得したい。

user = create(:user)

# test/factories/users.rb
# frozen_string_literal: true

FactoryBot.define do
  factory :user do
    email { 'test@example.com' }
    encrypted_password { '11111111' }
    name { 'テスト太郎' }
  end
end

ドキュメントにcreate_new_auth_tokenというのが存在する。新しい認証情報を作成して、返してくれるらしい。これ使えば取得できそう。
https://devise-token-auth.gitbook.io/devise-token-auth/usage/model_concerns

user = create(:user)
headers = user.create_new_auth_token
=>
{"access-token"=>"bbb",
 "token-type"=>"Bearer",
 "client"=>"aaa",
 "expiry"=>"1688539265",
 "uid"=>"test@example.com",
 "Authorization"=>
  "Bearer xxx"}

Authorization token-type使わなさそうなので、

headers = user.create_new_auth_token.slice('access-token', 'client', 'uid', 'expiry')
=>
{"access-token"=>"bbb",
 "client"=>"aaa",
 "expiry"=>"1688539265",
 "uid"=>"test@example.com",
}
ぐりこぐりこ

無事認証後にテストできました!

      class HogeTest < ActionDispatch::IntegrationTest
        setup do
          user = create(:user)
          @headers = user.create_new_auth_token.slice('access-token', 'client', 'uid', 'expiry')
        end

        test '正常にリクエストを送信できる' do
          get hoge_url, headers: @headers

          assert_response :success
        end
      end
このスクラップは2023/07/10にクローズされました