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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

1回答

911閲覧

RSpecに失敗します。。。

stamina_taro

総合スコア22

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2022/08/19 09:54

編集2022/08/20 14:59

前提

現在「現場で使えるRuby on rails5速習実践ガイド」という書籍を参考にしながらタスク管理アプリを作成しております。
教材を参考にコードを書き、bundle spec rspec spec/system/tasks_spec.rbを実行したところ、以下のエラーが発生しました。

発生している問題・エラーメッセージ

DEBUGGER: Attaching after process 97910 fork to child process 97932 ..F Failures: 1) タスク管理機能 詳細表示機能 ユーザーAがログインしているとき ユーザーAが作成したタスクが表示される Failure/Error: expect(page).to have_content '最初のタスク' expected to find text "最初のタスク" in "Taskleaf\nログイン\nログイン\nメールアドレス\nパスワード" [Screenshot Image]: /Users/sampleuser/taskleaf/tmp/capybara/failures_r_spec_example_groups_nested_nested_2_a_ユーザーaが作成したタスクが表示される_935.png # ./spec/system/tasks_spec.rb:42:in `block (4 levels) in <top (required)>' Finished in 9.74 seconds (files took 2.02 seconds to load) 3 examples, 1 failure Failed examples: rspec ./spec/system/tasks_spec.rb:41 # タスク管理機能 詳細表示機能 ユーザーAがログインしているとき ユーザーAが作成したタスクが表示される

spec/system/tasks_spec.rb

1require 'rails_helper' 2 3describe 'タスク管理機能', type: :system do 4 let(:user_a) { FactoryBot.create(:user, name: 'ユーザーA', email: 'a@example.com') } 5 let(:user_b) { FactoryBot.create(:user, name: 'ユーザーB', email: 'b@example.com') } 6 let!(:task_a) { FactoryBot.create(:task, name: '最初のタスク', user: user_a) } 7 8 before do 9 visit login_path 10 fill_in 'メールアドレス', with: login_user.email 11 fill_in 'パスワード', with: login_user.password 12 click_button 'ログインする' 13 end 14 15 describe '一覧表示機能' do 16 context 'ユーザーAがログインしているとき' do 17 let(:login_user) { user_a } 18 19 it 'ユーザーAが作成したタスクが表示される' do 20 expect(page).to have_content '最初のタスク' 21 end 22 end 23 24 context 'ユーザーBがログインしているとき' do 25 let(:login_user) { user_b } 26 27 it 'ユーザーAが表示したタスクが表示されない' do 28 expect(page).to have_no_content '最初のタスク' 29 end 30 end 31 end 32 33 describe '詳細表示機能' do 34 context 'ユーザーAがログインしているとき' do 35 let(:login_user) { user_a } 36 37 before do 38 visit task_path(task_a) 39 end 40 41 it 'ユーザーAが作成したタスクが表示される' do 42 expect(page).to have_content '最初のタスク' 43 end 44 end 45 end 46 47end

本来task_path(task_a)に遷移したいのですが、なぜかloginページに遷移して、テストが失敗します。
確かに、ログインしていないとloginページにリダイレクトされるようにしていますが、user_aでログインが成功しているのに何故??っていう感じです・・・。

該当のソースコード

application_controller.rb

1class ApplicationController < ActionController::Base 2 helper_method :current_user 3 before_action :login_required 4 5 private 6 7 def current_user 8 @current_user ||= User.find_by(id: session[:user_id]) if session[:user_id] 9 end 10 11 def login_required 12 redirect_to login_url unless current_user 13 end 14end

補足情報(FW/ツールのバージョンなど)

rails 7.0.3.1
rspec 3.11

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

find text "最初のタスク" in "Taskleaf\nログイン\nログイン\nメールアドレス\nパスワード"
ってlogin画面ですね。
ということは、loginに失敗してるってことです。
fill_in 'パスワード', with: login_user.password が問題のような。
これは 生 のpasswordではなく 暗号化されたpasswordでしょうから。生のを入れないと。
let(:user_a) にて passwordも指定しましょう。

投稿2022/08/20 00:32

winterboum

総合スコア23284

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stamina_taro

2022/08/20 02:25

ご回答ありがとうございます! spec/factories/users.rbにてデフォルトで生のpasswordを指定しているのですが、なぜかloginに失敗してしまうんですよね。。 恐らく、visit login_pathでloginに成功した後、task_path(task_a)に遷移する時にcurrent_userが反応して、loginページにリダイレクトされてしまうからかな?と思っているんですけど、何故なのかが分からないです。。。。
winterboum

2022/08/20 02:39

ですから、 login_user.password だと暗号化されてるので Factoryで指定した生を入れて
stamina_taro

2022/08/20 02:50

ご返信ありがとうございます。 let(:user_a) { FactoryBot.create(:user, name: 'ユーザーA', email: 'a@example.com', password: 'password') } と変更して、テストをしましたが、依然loginページにリダイレクトされます。 一つ目のテストが成功しているので、login自体は成功していると思います。
winterboum

2022/08/20 05:59

fill_in 'パスワード', with: login_user.password ここはなおしました?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問