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)
公式ドキュメントを読んでいく。
まず、authenticate_user!
するときに必要なheaders
情報はaccess-token
, client
, expiry
, uid
であることがわかる。
なのでこのheader情報を取得したい。factory-botで作成したデータからこの情報を取得できるのだろうか?
ダミーデータ作成の仕方はこんな感じ。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
というのが存在する。新しい認証情報を作成して、返してくれるらしい。これ使えば取得できそう。
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にクローズされました