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

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

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

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

RSpec

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

受付中

RSpecでログイン状態が維持されない

shira
shira

総合スコア27

Ruby on Rails 6

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

RSpec

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

0回答

0評価

0クリップ

141閲覧

投稿2022/04/06 02:06

アプリ内のフォロー機能をテストするためrspecで次のように記述しました

spec/system/follow_spec.rb require 'rails_helper' describe 'フォロー機能' do before do @follower = FactoryBot.create(:user, email: "sample@example.com", activated: true) @followed = FactoryBot.create(:user, activated: true) visit login_path fill_in "Email", with: "sample@example.com" fill_in "Password", with: "password" click_button "Log in" end it 'ユーザーをフォローする' do visit user_path(@followed) click_button 'Follow' expect(@follower.following).to include(@followed) end end

実行結果は以下のようにエラーとなります

フォロー機能 ユーザーをフォロー/フォロー解除する (FAILED - 1) Failures: 1) フォロー機能 ユーザーをフォロー/フォロー解除する Failure/Error: click_button 'Follow' Capybara::ElementNotFound: Unable to find button "Follow" that is not disabled [Screenshot]: /Users/sjira/environment/sample_app/tmp/screenshots/failures_r_spec_example_groups_nested_ユーザーをフォロー_フォロー解除する_918.png # ./spec/system/following_spec.rb:15:in `block (2 levels) in <top (required)>' Finished in 9.25 seconds (files took 0.78899 seconds to load) 1 example, 1 failure Failed examples: rspec ./spec/system/following_spec.rb:13 # フォロー機能 ユーザーをフォロー/フォロー解除する

スクリーンショットを見ると"visit user_path(@followed)"でユーザーページは開いていますがログインしていないために、フォローボタンが表示されていない状態でした(そのような仕様です)
一方でログイン機能のテストは通るので、ログインはできるけれど状態が維持されていないのだと思います
この原因を教えていただきたいです

ログイン機能のテスト、ログイン機能のコントローラは以下のとおりです

spec/system/login_spec.rb require 'rails_helper' describe 'ログイン機能', type: :system do before do @user = FactoryBot.create(:user, email: "sample@example.com") end describe '無効なユーザーでログイン' do before do visit login_path fill_in 'Email', with: 'sample@example.com' fill_in 'Password', with: 'password' click_button 'Log in' end it 'ログインページに戻される' do expect(page).to have_content "Log in" end end describe '有効なユーザー' do before do @user.toggle!(:activated) end context '誤ったパスワードでログイン' do before do visit login_path fill_in 'Email', with: 'sample@example.com' fill_in 'Password', with: 'foobar' click_button 'Log in' end it 'ログインページに戻される' do expect(page).to have_content "Log in" end end context '誤ったアドレスでログイン' do before do visit login_path fill_in 'Email', with: 'foo@bar.com' fill_in 'Password', with: 'password' click_button 'Log in' end it 'ログインページに戻される' do expect(page).to have_content 'Log in' end end context '正しいパスワード・アドレスでログイン' do before do visit login_path fill_in 'Email', with: 'sample@example.com' fill_in 'Password', with: 'password' click_button 'Log in' end it 'ユーザーページへ遷移' do expect(page).not_to have_content "Log in" expect(page).to have_content "Account" end end end end
app/controllers/sessions_controller.rb class SessionsController < ApplicationController def new end def create @user = User.find_by(email: params[:session][:email]) if @user&.authenticate(params[:session][:password].downcase) if @user.activated? log_in(@user) params[:session][:remember_me] == "1" ? remember(@user) : forget(@user) redirect_back_or(@user) else message = "Account not activated. " message += "Check your email for the activation link." flash[:warning] = message redirect_to root_url end else flash.now[:danger] = "invalid email/password combination" render "new" end end def destroy log_out if logged_in? redirect_to root_url end end

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Ruby on Rails 6

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

RSpec

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