質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

解決済

rspecでログイン状態(session値の設定)を再現する方法について

Harluz
Harluz

総合スコア19

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

1回答

0リアクション

0クリップ

5505閲覧

投稿2020/12/27 02:33

編集2020/12/27 09:38

rails tutorialを参考にログイン機能やbefore_actionにてログイン済みのみができるアクションを実装しました。
そのテストコードにおいてログインの有無の2パターンでテストを実行したいと思います。

ログインをしていない場合は、単純に制限のあるURLをgetすれば再現できると考えています。
ログインしている場合は、postリクエスト及び必要情報を渡すことでログインを再現できるのではないかと思います。
このことから、下記の通りにテストコードを記述して見ました。が、rspecのログを確認するとログインできていない動作になっております。

helperにてログイン状態を再現するメソッドを定義

testhelper

include ApplicationHelper module TestHelper def log_in_as(user, remember_me: '1') post login_path, params: { session: { email: user.email, password: user.password, remember_me: remember_me } } end end

テストヘルパーを全てのスペックで使用できるようにinclude済み

railshelper

RSpec.configure do |config| config.include TestHelper end

factorybot

FactoryBot.define do factory :user, class: :user do name { Faker::Name.name } sequence(:email) { |n| "example#{n}@example.com" } image { Rack::Test::UploadedFile.new(File.join(Rails.root, 'spec/fixtures/test.jpg')) } password { 'foobar' } password_confirmation { 'foobar' } trait :admin do admin { true } end end end

UsersRequestSpec

describe 'GET #index' do subject { response } # ユーザーのログインの有無を確認 describe 'before_action :logged_in_user' do let!(:user) { FactoryBot.create(:user) } # ユーザーがログインしている場合 context 'The user is logged in' do before do log_in_as(user) ← ログイン状態を再現しているはず get users_path end it 'responds successfully' do is_expected.to be_successful end it 'returns a 200 response' do is_expected.to have_http_status(200) end end end

rspecのログ
赤線部分が疑問な箇所になりまして、一本目ではpostした情報を元にuserをログインし、2本目でusers/1(user.id)にアクセスしているのでここまでは期待した動作になっています。しかし、その後にredirectで/loginにアクセスしています。

usercontrollerを下記の通りに示します。(抜粋)

UserController

before_action :logged_in_user, only: %i[index edit update destroy] PER = 10 def index @users = User.page(params[:page]).per(PER) end private # ログイン済みユーザーかどうか確認 def logged_in_user # ログインしていないのなら unless logged_in? (解説:sessionにuser.idがあればtureを返す。userがログインしたらuser.idを元にsessionに情報が格納される) store_location flash[:danger] = 'Please log in.' redirect_to login_url end end

rsepcのログをみる限りログインできていないことから、before_actionの logged_in_userによってlogin_urlに飛ばされているのだと思います。

どのようにすればこれのテストを再現することができるのでしょうか?
ちなみに、ブラウザ情では期待している動作になっておりますので、問題はないかと思います。

どんな些細なことでも構いませんので、どなたか教えていただければとても助かります。
よろしくお願いします。

neko_daisukiさんの回答より
test_helperを下記のメソッドを追記

testhelper

def sign_in(user) allow_any_instance_of(ActionDispatch::Request).to receive(:session).and_return(user_id: user.id) end

usersrequestspec

subject { response } let(:user) { FactoryBot.create(:user) } # ユーザーがログインしている場合 context 'The user is logged in' do before do sign_in(user) ← 修正 get edit_user_path(user) end it 'responds successfully' do is_expected.to be_successful end it 'returns a 200 response' do is_expected.to have_http_status(200) end end

rspecを実行した結果
テスト成功状況
しっかりsessionの値を取得しrenderしていることが確認できます。

neko_daisukiさんの記述していただいたコードでは以前と同じログになったため、下記qiitaの記事を参考にしたところ、成功いたしました。
request spec で session 値を設定する

詳しい挙動等についてはこれから調べるため説明することはできませんが、とりあえず動作することができましたので、同じようにつまづいている方の参考になればと思います。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。