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

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

ただいまの
回答率

89.08%

Railsのログイン認証のテスト(RSpec)

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 4,626

takeo7

score 18

前提・実現したいこと

Rspecでログイン認証のテストがどうしてもうまくいかないです。
現在はモックを使って試しているのですが、エラーが出てしまいます。
下記のログイン認証のテストの仕方をご教授ください!
(Device等のログイン認証のライブラリは使っていません。)

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

1) SessionsController sessions#create 正常なログイン情報でログインした場合 TOP画面へ遷移されること
     Failure/Error: user = User.find_by(login_id: params[:session][:login_id])

     NoMethodError:
       undefined method `[]' for nil:NilClass
     # ./app/controllers/sessions_controller.rb:9:in `create'
     # ./spec/controllers/sessions_controller_spec.rb:20:in `block (4 levels) in <top (required)>'

Rspec

#  /sessions_controller_spec.rb

describe 'sessions#create' do
    context '正常なログイン情報でログインした場合' do
      before do
        user = create(:user)
        allow(User).to receive(:find_by).and_return(user)
      end
      it 'TOP画面へ遷移されること' do
        post :create
        expect(response).to redirect_to top_path
      end
   end
end

Controller

#  /sessions_controller.rb
class SessionsController < ApplicationController

  skip_before_action :user_logged_in?

def create
      user = User.find_by(login_id: params[:session][:login_id])
      if user == user.authenticate(params[:session][:password])
          log_in user
          redirect_to top_path
      else
          redirect_to login_path, flash: { alert: '※ログイン情報が正しくありません'}
    end
  end

Factory

#  /user.rb

FactoryGirl.define do
    factory :user do
        login_id 'test'
        password 'password'
        last_name '田中'
        first_name '正'
        group_id 1
        role_id 1
    end
emd

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

rails -v 5
rspec -v 3.5

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

これは、params[:session]がnilなため、エラーが出てしまっています。

#sessions_controller
def create
      user = User.find_by(login_id: params[:session][:login_id])

以下のようにして、postする時にパラメーターを渡してあげましょう。 
ゆーざーidとパスワードはテストに通る値を入れてください。

post :create, session: { user_id: 'ユーザーid', password: 'パスワード'}
#  /sessions_controller_spec.rb

describe 'sessions#create' do
    context '正常なログイン情報でログインした場合' do
      before do
        user = create(:user)
        allow(User).to receive(:find_by).and_return(user)
      end
      it 'TOP画面へ遷移されること' do
        post :create, session: { user_id: 'ユーザーid', password: 'パスワード'}
        expect(response).to redirect_to top_path
      end
   end
end

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/18 20:02

    ご回答ありがとうございます!
    そして、以前2回もご回答いただいていたのに返答できず申しわけありません!

    パラメーターを渡してみたのですが、同様のエラーになってしまいます。
    ハッシュの形を合わせたらいいのかなと思い変なコードですが
    params: { session: { login_id: 'id', password: 'pass' } }
    ってしてみたらエラーは変わりましたがやはりダメでした。

    Mockの書き方がおかしいとかもあるのでしょうか?

    よろしくお願いします!

    キャンセル

  • 2016/10/18 20:06 編集

    いえいえ!返事は全然大丈夫ですよ!

    変わったエラーは、どのようなエラーでしたか?
    もし良かったら、質問に追記していただけたら何か分かるかもです!
    paramsのところでエラーになっているなら、mockでは無いと思うのですが…

    キャンセル

  • 2016/10/19 15:47

    ありがとうございます!

    いろいろいじっていたら
    params: { session: { login_id: 'id', password: 'pass' } }
    これでいけました!
    昨日の時点のものとどこが変わったのかよくわかりませんが...w

    ご丁寧な回答ありがとうございました!

    キャンセル

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

  • ただいまの回答率 89.08%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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