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

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

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

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

7836閲覧

なぜRSpecのリクエストスペックで、!session[:user_id].nil?が使えるのか

suny

総合スコア48

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2020/04/29 02:23

RSpec、とりわけリクエストスペックでの質問です。
リクエストスペックで!session[:user_id].nil?がなぜ使えるのかが疑問です。

session[:user_id] = user.idを行った際はsessionメソッドは使えません。とエラーが出ました。

# spec/support/login_support.rb module LoginUser # このメソッドがなぜリクエストスペックで使えるのかが疑問 def is_logged_in? !session[:user_id].nil? end # これは使えない def test_log_in(user) session[:user_id] = user.id end RSpec.configure do |config| config.include LoginUser end end
# spec/request/sessions_request_spec.rb require 'rails_helper' RSpec.describe "Sessions", type: :request do let(:user) { FactoryBot.attributes_for(:user) } describe "destroy" do before do post users_path, params: { user: user } end # このitは通る it "ログイン状態じゃなくなる" do delete logout_path(user) expect(is_logged_in?).to_not be_truthy # このexpectで使用 end end describe "create" do     # このitはエラー it "sessionメソッドを使いログイン", focus: true do test_log_in( FactoryBot.create(:user) ) # test_log_inはここで使用 expect(is_logged_in?).to be_truthy end end end
# エラー文 Failure/Error: session[:user_id] = user.id NoMethodError: undefined method `session' for nil:NilClass

system specでsessionメソッドが使えないのは知っていましたが、リクエストスペックでも使えないのでしょうか?

繰り返しになりますが、その場合なぜis_logged_inメソッドは使えたのでしょうか?

よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こちらの内容を手元の同じようなRailsプロジェクトで確認してみました。

リクエストスペックの中でもsessionメソッドは使えるみたいですね。
コードを追いかけていくと、以下のメソッドが呼び出されていることがわかりました。

ruby

1# https://github.com/rails/rails/blob/v6.0.3/actionpack/lib/action_dispatch/testing/test_process.rb#L34 2def session 3 @request.session 4end

ただし、実装コード上は@requestが存在していることが前提なので、sessionメソッドをエラーなく呼び出すためには、事前に何らかのリクエストが発行されていることが条件になります。
describe "create" doのテストはリクエスト無しでいきなりsessionメソッドを呼びだしているため@requestnilになっていて、エラーが発生しているものと思われます。
@requestが存在していれば、session[:user_id] = user.idも動くはずです。

投稿2020/05/06 22:38

jnchito

総合スコア357

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

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

suny

2020/05/08 08:08

ありがとうございます!
guest

0

Rspecにそこまで詳しくはないのですが、上の方のdescribeだけbeforepostが書かれています。これがsessionを用意している可能性はないでしょうか。

投稿2020/04/29 02:28

maisumakun

総合スコア145023

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

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

suny

2020/04/29 02:59

回答ありがとうございます。 beforeを無くしてテストしてみましたが、同じでした。
maisumakun

2020/04/29 03:04

上ではsessionにアクセスする前にdeleteを行っているから、リクエストを前提とするsessionが存在する、という可能性も考えられます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問