Open rook1202 opened 1 week ago
新規登録についてのテストコードを2つ追加してみたところ、登録はできませんでしたが、下のフラッシュメッセージはきちんと表示されていることがわかりました。 以下他にも検証した結果、登録しようとしているDBが違うかもしれません。もしそうだった場合、どこで設定を間違えているのか教えていただきたいです。
RSpec.describe 'ユーザー登録', type: :system do
it 'ユーザーが新規作成できること' do
visit '/users/new'
expect {
fill_in 'user_name', with: 'てすと'
fill_in 'user_email', with: 'example@example.com'
fill_in 'user_password', with: '12345678'
fill_in 'user_password_confirmation', with: '12345678'
click_button '登録'
}.to change { User.count }.by(1)
expect(page).to have_content('ユーザー登録が完了しました'), 'フラッシュメッセージ「ユーザー登録が完了しました」が表示されていません'
end
it 'ユーザーが新規作成できない' do
visit '/users/new'
expect {
fill_in 'user_email', with: 'example@example.com'
click_button '登録'
}.to change { User.count }.by(0)
expect(page).to have_content('ユーザー登録に失敗しました'), 'フラッシュメッセージ「ユーザー登録に失敗しました」が表示されていません'
expect(page).to have_content('ユーザー名 を入力してください'), 'エラーメッセージ「姓を入力してください」が表示されていません'
expect(page).to have_content('パスワード は6文字以上で入力してください'), 'フラッシュメッセージ「パスワード6文字以上で入力してください」が表示されていません'
end
end
ユーザー新規登録の前後に puts User.all.inspect # データベース内のユーザーを確認 を入れたところ相変わらずDBには何も登録されていないのですが、
$ docker-compose exec -e RAILS_ENV=test web bundle exec rspec
F.FF#<ActiveRecord::Relation []>
#<ActiveRecord::Relation []>
F.
controllerの登録失敗に Rails.logger.debug "User save failed: #{@user.errors.full_messages}" こちらを挿入してログを確認したところ
User save failed: ["メールアドレス はすでに登録されています"]
このようにメッセージが出ていました。
$ docker-compose exec -e RAILS_ENV=test web rails c
Loading test environment (Rails 7.0.8.4)
irb(main):001> User.all
User Load (0.8ms) SELECT `users`.* FROM `users`
=> []
DBを確認してもテストが終わると毎回削除されています。 datebase.yml
test:
<<: *default
database: runteq_graduation_test
rails_helper.rb
# This file is copied to spec/ when you run 'rails generate rspec:install'
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require_relative '../config/environment'
ちなみにFactoryBotで作成するemailはtest@example.comなので違います。
rails_helper.rb
# Capybaraがサーバーを起動しないように設定
Capybara.run_server = false
Capybara.app_host = "http://web:3000" # Docker Composeの`web`サービスに直接接続
RSpec.configure do |config|
config.before(:each, type: :system) do
driven_by :remote_chrome
end
end
この設定にしたのはCapybara.run_serverとポート設定の競合したためで Capybara.server_port = 0 を指定しても、Capybara.app_hostで動的に割り当てられたポートを正しく参照できていない状態で、 Capybara.current_session.server.port を使用したコードが適切に動作せず、通信エラーや遅延を引き起こしていたためです。ただこのせいで開発環境のDBを使用してしまったので結局うまく動きませんでした。
RSpec.configure do |config|
config.before(:each, type: :system) do
driven_by :remote_chrome
# Docker内の`web`サービスのIPアドレスを取得
ip = Socket.ip_address_list.detect(&:ipv4_private?).ip_address
Capybara.server_host = ip
Capybara.app_host = "http://#{ip}:#{Capybara.current_session.server.port}"
Capybara.run_server = true
Capybara.server = :puma, { Silent: true }
end
end
申し訳ありません、解決いたしました!
ログインできなかった理由はテストコードではテスト用DBに、コントローラーからは開発環境用DBに接続しておりデータの照合、新規登録などがうまくいっておりませんでした。 念のためコメントに解決理由を残しておりますが、確認不要です。
解決したいこと・達成したいものについて
RSpecのテストコードで、ログインができない状態を解決したいです。
聞きたいこと・アドバイスが欲しいこと
ChatGPTでここまで確認しましたが、他にどこを確認していいのかわからなくなってしまいました。 ログインのできない原因、もしくは他に疑わしいところ、確認するべきところがあれば教えていただけないでしょうか?よろしくお願いいたします。
追記:下のコメントに検証を追加しておりますが、登録しようとしているDBが違うかもしれません。 テストコードのcreateではtest用のDBにデータを作成していますが、controllerから操作したときに別のDBを参照しているかもしれません。もしそうだった場合、どこで設定を確認するべきか教えていただきたいです。
実装の際に参考にした資料等
RUNTEQの課題で使用していたRSpecのコード
Capybara.assert_current_pathとFakerは設定しておりません。
現状のコードの状態がわかるURL(プルリクエスト・リポジトリ等)
Rspec関係のプルリクエスト: https://github.com/rook1202/runteq_graduation_productio-/pull/63 リポジトリ: https://github.com/rook1202/runteq_graduation_productio-
現状のコードの状態がわかるURLのどこが関係していると考えているのか
RSpecの実行結果
デバックコード
デバック結果
こちらの結果から、ユーザーデータの作成と、入力内容は意図の通りできていると思います。 ただ以下のようにコントローラーで以下のようにテスト中のデバック行ったところ、
デバック結果
permitted: falseとなってしまうことと User not foundが出ています。 ちなみにパスワード認証にはSorceryを使用しています。
検証した結果から分かったこと・考えたこと
controllerのデバック結果からDBに該当のデータが見つからず、認証が失敗していると考えられます。 ただlogin_spec.rbではユーザーデータの作成はできており、入力内容も合っていると出ていますので、どこを確認するべきなのかわからなくなってしまいました。