前提・実現したいこと
RSpecでログインのテストを実現したいです。
sessionの情報の扱っている動作の実現してログインを再現したいです。
発生している問題・エラーメッセージ
エラーメッセージ SessionsController sessions#create ログインが成功した場合 ユーザー名が同じであること (FAILED - 1) passwordが同じであること (FAILED - 2) マイページにリダイレクトされること (FAILED - 3) Failures: 1) SessionsController sessions#create ログインが成功した場合 ユーザー名が同じであること Failure/Error: post login_path, params: { session: { id: @user.id, name: @user.name, password: @user.password } } ActionController::UrlGenerationError: No route matches {:action=>"/login", :controller=>"sessions",:session=>{:id=>1, :name=>"testuser",:password=>"password"}} /usr/local/bundle/gems/rails-controller-testing-1.0.5/lib/rails/controller/testing/template_assertions.rb:62:in `process /usr/local/bundle/gems/rails-controller-testing-1.0.5/lib/rails/controller/testing/integration.rb:16:in block (2 levels) in <module:Integration> ./spec/controllers/sessions_controller_spec.rb:6:in `block (2 levels) in <top (required)>'
該当のソースコード
sessions_controller.rb[テスト対象]
class SessionsController < ApplicationController def create user = User.find_by(name: params[:session][:name]) if user && user.authenticate(params[:session][:password]) session[:user_id] = user.id redirect_to mypage_path else render 'home/index' end end def destroy session.delete(:user_id) redirect_to root_path end end
sessions_controller_spec.rb[テストコード]
require 'rails_helper' RSpec.describe SessionsController, type: :controller do before do @user = FactoryBot.build(:user) post login_path, params: { session: { id: @user.id, name: @user.name, password: @user.password } } end describe 'sessions#create' do context "ログインが成功した場合" do it 'ユーザー名が同じであること' do expect(@user.name).to eq 'testuser' end it 'passwordが同じであること' do expect(@user.password).to eq 'password' end it 'マイページにリダイレクトされること' do expect(post :create, params: params).to redirect_to(mypage_path) end end end end
users.rb[セッション情報のモック]
FactoryBot.define do factory :user do id { 1 } name { "testuser" } password{ "password" } end end
試したこと
テストデータの作成をFactoryBotを使用してセッション情報の再現。
⇨ハッシュをうまく再現できていないため、URLが生成されない。
before部分に、post: createを記述。
⇨失敗。
require 'sessions_controller'を追記
⇨同じ内容のエラーメッセージで失敗。
補足情報(FW/ツールのバージョンなど)
[作業環境]
macOS BigSur 11.2
Ruby 2.4.5
Rails 5.2.2
RSpec 3.9.0
回答1件
あなたの回答
tips
プレビュー