13
8

More than 5 years have passed since last update.

コントローラのテストをRequest specで書く際に、session値を設定する

Last updated at Posted at 2019-06-14

はじめに

テスト対象外のロジック(sessionの取得)が原因でテストが進まなかったため、
session値を設定する必要がありました

動作環境

RSpec 3.7

テストの対象ソース

Orders_Controller.rb

class OrdersController < ApplicationController
  include SessionHelper
  before_action :authorized_user, only: [:index, :show, :edit, :update]

  def index
    @user = current_user
    @orders = @user.orders
  end
end
session_helper.rb

class SessionHelper
  def current_user
    token = session[:token]
    if token.present?
      @user ||= User.find_by(id:session[:user_id])
    end
  end
end

エラーが出た書き方

orders_controller_spec.rb
require 'rails_helper'

RSpec.describe OrdersController, type: :request do

  describe "GET #index" do

    let(:user)  { create(:user) }
    let(:order) { create(:order, user_id, user.id) }

    it 'リクエストは200 OKとなること' do
      get orders_url , params: { session: { token: user.token, user_id: user.id } }
      expect(response.status).to eq 200
    end
  end
end

エラー内容

コンソール
  1) OrdersController GET #index リクエストは200 OKとなること
     Failure/Error: @orders = @user.orders
     NoMethodError:
       undefined method `orders' for nil:NilClass

サクセスした書き方

orders_controller_spec.rb
require 'rails_helper'

RSpec.describe OrdersController, type: :request do

  describe "GET #index" do

    let(:user)  { create(:user) }
    let(:order) { create(:order, user_id, user.id) }

    before do
      allow_any_instance_of(ActionDispatch::Request).to receive(:session).and_return({ remember_token: user.remember_token, remember_user_id: user.id })
    end

    it 'リクエストは200 OKとなること' do
      get orders_url
      expect(response.status).to eq 200
    end
  end
end

このようにスタブ化することで、sessionを設定できました

こちらの記事を参考にさせていただきました

13
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
8