teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

6

自己解決した経緯について追記・タイトルの修正

2021/01/01 12:45

投稿

lah
lah

スコア19

title CHANGED
@@ -1,1 +1,1 @@
1
- request specでのupdateアクションの再現について(before_action有り)
1
+ rspec発生するlib/rack/session/abstract/id.rb:375:in 'commit_sesion'解決方法について
body CHANGED
@@ -155,4 +155,33 @@
155
155
  protect_from_forgery with: :exception, only: %i[create update destroy]
156
156
  ```
157
157
  結果、何も変わりませんでした。
158
- これも何かの参考になればと追記いたしました。
158
+ これも何かの参考になればと追記いたしました。
159
+
160
+
161
+
162
+ -----------自己解決について-----------------
163
+
164
+ 結論:実行環境が異なっていたこと
165
+
166
+
167
+
168
+ rspecのログ画像を確認して頂きたいが、
169
+ ```log
170
+ lib/rack/session/abstract/id.rb:375:in 'commit_sesion'
171
+ ```
172
+ と記述されている。このコードは下記画像の通りとなる
173
+ ![commit_session](9f0e4f5af83cd8d3b47439b1e7a05537.png)
174
+ ログからもoptionsメソッドが未定義となっており、なんらかの形で定義できない現象が発生している。
175
+ このコードを遡り読み解いた限り(初学者なため間違えている可能性あり)
176
+ 「requestを飛ばした際に、headerにHTTPリクエストと環境情報を渡している」
177
+ ことが分かった。
178
+ rspecのログではpatchリクエストは正常に動作していることから、環境情報に問題があるのではないか?と仮説を立てる。
179
+ とても初歩的で恥ずかしいが、rspecはどの環境で動作しているのか把握しておらず、検索したところ
180
+ 「環境情報を指定しない限りはtest環境で動作する」
181
+ となっていた。そもそもtest用のDBやmigrateを行った記憶がなかった。
182
+ 実際に実行してみるとエラーとなり、test環境のDBがcreateできない状態となっておりました。(docker環境)
183
+ 今までrspecがdevelopment環境で動作していた(と思われる?)こととなりoptionsメソッドに悪影響を及ぼしていた可能性があります。
184
+ なんとか、テスト用のDBの作成migrateを実行し、再度テストを実行した結果、無事通りました。
185
+
186
+ neko_daisukeさんよりたくさんのヒントを頂き解決することができました。
187
+ 本当にありがとうございます。

5

CSRF対策について行ったことを記述

2021/01/01 12:45

投稿

lah
lah

スコア19

title CHANGED
File without changes
body CHANGED
@@ -141,4 +141,18 @@
141
141
  ```railshelper
142
142
  config.use_transactional_fixtures = true
143
143
  ```
144
- 結果、ログの内容は変わリませんでした。
144
+ 結果、ログの内容は変わリませんでした。
145
+
146
+ -----------CSRF対策を疑ってみた(空振りに終わる)-----------------
147
+ ```testrb
148
+ config.action_controller.allow_forgery_protection = false
149
+ ```
150
+ rails生成時にtest.rbには上記が記述されており、デフォルトではテスト環境でCSRF対策の検証は行わないことになっている。
151
+ 以前、createアクションのテスト実行時にCSRF関係のエラーが発生した経緯が有りました。
152
+ 今回においても、getリクエストのテスト(indexやedit)については通るが、update/deleteなどget以外のリクエストによりエラーが発生しているのではと仮説を立てました。
153
+ このことから、下記の通りにusers_controller.rbを修正してみました。
154
+ ```userscontrollerrb
155
+ protect_from_forgery with: :exception, only: %i[create update destroy]
156
+ ```
157
+ 結果、何も変わりませんでした。
158
+ これも何かの参考になればと追記いたしました。

4

rspecのデフォルトのDatabaseCleanerに戻した結果

2020/12/30 06:28

投稿

lah
lah

スコア19

title CHANGED
File without changes
body CHANGED
@@ -78,6 +78,8 @@
78
78
 
79
79
  どんな些細なことでも構いませんので、どなたか教えていただきたいです。
80
80
 
81
+ 下記は時系列に対応した状況を示したもの
82
+
81
83
  ----------------試したこと------------------------
82
84
  作成したmock_sign_inメソッドについて
83
85
  ```testhelper
@@ -133,4 +135,10 @@
133
135
  ```
134
136
  ![indexアクションのログ](838573bcb7aeed032e4dd33241edf008.png)
135
137
  error logについて
136
- ![error log](ae0a14399edb48e4cf16e096f8cb726d.png)
138
+ ![error log](ae0a14399edb48e4cf16e096f8cb726d.png)
139
+
140
+ -----------RspecのデフォルトのDatabaseCleanerに戻した結果-----------------
141
+ ```railshelper
142
+ config.use_transactional_fixtures = true
143
+ ```
144
+ 結果、ログの内容は変わリませんでした。

3

経過状況がわかるように修正

2020/12/29 13:07

投稿

lah
lah

スコア19

title CHANGED
File without changes
body CHANGED
@@ -78,6 +78,7 @@
78
78
 
79
79
  どんな些細なことでも構いませんので、どなたか教えていただきたいです。
80
80
 
81
+ ----------------試したこと------------------------
81
82
  作成したmock_sign_inメソッドについて
82
83
  ```testhelper
83
84
  def mock_sign_in(user)
@@ -90,6 +91,8 @@
90
91
  様々なサイト等を参考に落とし込んでみたのですが、、、
91
92
  多分、間違えてます。
92
93
 
94
+
95
+ -----------neko_daisukiさんより頂いた回答について-----------------
93
96
  indexアクションのテストについて
94
97
  ```usresrequestsspec
95
98
  describe 'GET #index' do

2

回答のあった件について、追加情報

2020/12/29 06:39

投稿

lah
lah

スコア19

title CHANGED
File without changes
body CHANGED
@@ -88,4 +88,46 @@
88
88
  end
89
89
  ```
90
90
  様々なサイト等を参考に落とし込んでみたのですが、、、
91
- 多分、間違えてます。
91
+ 多分、間違えてます。
92
+
93
+ indexアクションのテストについて
94
+ ```usresrequestsspec
95
+ describe 'GET #index' do
96
+ subject { response }
97
+ # ユーザーのログインの有無を確認
98
+ describe 'before_action :logged_in_user' do
99
+ let!(:user) { FactoryBot.create(:user) }
100
+ # ユーザーがログインしている場合
101
+ context 'The user is logged in' do
102
+ before do
103
+ sign_in(user)
104
+ get users_path
105
+ end
106
+ it 'responds successfully' do
107
+ is_expected.to be_successful
108
+ end
109
+
110
+ it 'returns a 200 response' do
111
+ is_expected.to have_http_status(200)
112
+ end
113
+ end
114
+ # ユーザーがログインしていない場合
115
+ context 'The user is not logged in' do
116
+ before do
117
+ get users_path
118
+ end
119
+
120
+ it 'redirect to login url' do
121
+ is_expected.to redirect_to login_url
122
+ end
123
+
124
+ it 'returns a 302 response' do
125
+ is_expected.to have_http_status(302)
126
+ end
127
+ end
128
+ end
129
+ end
130
+ ```
131
+ ![indexアクションのログ](838573bcb7aeed032e4dd33241edf008.png)
132
+ error logについて
133
+ ![error log](ae0a14399edb48e4cf16e096f8cb726d.png)

1

mock_sign_inメソッドを追記

2020/12/29 06:35

投稿

lah
lah

スコア19

title CHANGED
File without changes
body CHANGED
@@ -76,4 +76,16 @@
76
76
  「allow_any_instance_ofは非推奨」という記事を拝見しました。
77
77
  このことから、allow_any_instance_ofを使用しない書き方に変更しようとしましたが、うまく動作しませんでした。(書き方が間違えているだけなのは把握しておりますが、正解がわからない状態です)
78
78
 
79
- どんな些細なことでも構いませんので、どなたか教えていただきたいです。
79
+ どんな些細なことでも構いませんので、どなたか教えていただきたいです。
80
+
81
+ 作成したmock_sign_inメソッドについて
82
+ ```testhelper
83
+ def mock_sign_in(user)
84
+ mock_ActionDispatch = instance_double(ActionDispatch::Request)
85
+ allow(mock_ActionDispatch).to receive(:session)
86
+
87
+ allow(mock_ActionDispatch).to receive(:session).and_return(user_id: user.id)
88
+ end
89
+ ```
90
+ 様々なサイト等を参考に落とし込んでみたのですが、、、
91
+ 多分、間違えてます。