質問編集履歴

6

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

2021/01/01 12:45

投稿

lah
lah

スコア19

test CHANGED
@@ -1 +1 @@
1
- request specでのupdateアクションの再現について(before_action有り)
1
+ rspecで発生するlib/rack/session/abstract/id.rb:375:in 'commit_sesion'の解決方法について
test CHANGED
@@ -313,3 +313,61 @@
313
313
  結果、何も変わりませんでした。
314
314
 
315
315
  これも何かの参考になればと追記いたしました。
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+ -----------自己解決について-----------------
324
+
325
+
326
+
327
+ 結論:実行環境が異なっていたこと
328
+
329
+
330
+
331
+
332
+
333
+
334
+
335
+ rspecのログ画像を確認して頂きたいが、
336
+
337
+ ```log
338
+
339
+ lib/rack/session/abstract/id.rb:375:in 'commit_sesion'
340
+
341
+ ```
342
+
343
+ と記述されている。このコードは下記画像の通りとなる
344
+
345
+ ![commit_session](9f0e4f5af83cd8d3b47439b1e7a05537.png)
346
+
347
+ ログからもoptionsメソッドが未定義となっており、なんらかの形で定義できない現象が発生している。
348
+
349
+ このコードを遡り読み解いた限り(初学者なため間違えている可能性あり)
350
+
351
+ 「requestを飛ばした際に、headerにHTTPリクエストと環境情報を渡している」
352
+
353
+ ことが分かった。
354
+
355
+ rspecのログではpatchリクエストは正常に動作していることから、環境情報に問題があるのではないか?と仮説を立てる。
356
+
357
+ とても初歩的で恥ずかしいが、rspecはどの環境で動作しているのか把握しておらず、検索したところ
358
+
359
+ 「環境情報を指定しない限りはtest環境で動作する」
360
+
361
+ となっていた。そもそもtest用のDBやmigrateを行った記憶がなかった。
362
+
363
+ 実際に実行してみるとエラーとなり、test環境のDBがcreateできない状態となっておりました。(docker環境)
364
+
365
+ 今までrspecがdevelopment環境で動作していた(と思われる?)こととなりoptionsメソッドに悪影響を及ぼしていた可能性があります。
366
+
367
+ なんとか、テスト用のDBの作成migrateを実行し、再度テストを実行した結果、無事通りました。
368
+
369
+
370
+
371
+ neko_daisukeさんよりたくさんのヒントを頂き解決することができました。
372
+
373
+ 本当にありがとうございます。

5

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

2021/01/01 12:45

投稿

lah
lah

スコア19

test CHANGED
File without changes
test CHANGED
@@ -285,3 +285,31 @@
285
285
  ```
286
286
 
287
287
  結果、ログの内容は変わリませんでした。
288
+
289
+
290
+
291
+ -----------CSRF対策を疑ってみた(空振りに終わる)-----------------
292
+
293
+ ```testrb
294
+
295
+ config.action_controller.allow_forgery_protection = false
296
+
297
+ ```
298
+
299
+ rails生成時にtest.rbには上記が記述されており、デフォルトではテスト環境でCSRF対策の検証は行わないことになっている。
300
+
301
+ 以前、createアクションのテスト実行時にCSRF関係のエラーが発生した経緯が有りました。
302
+
303
+ 今回においても、getリクエストのテスト(indexやedit)については通るが、update/deleteなどget以外のリクエストによりエラーが発生しているのではと仮説を立てました。
304
+
305
+ このことから、下記の通りにusers_controller.rbを修正してみました。
306
+
307
+ ```userscontrollerrb
308
+
309
+ protect_from_forgery with: :exception, only: %i[create update destroy]
310
+
311
+ ```
312
+
313
+ 結果、何も変わりませんでした。
314
+
315
+ これも何かの参考になればと追記いたしました。

4

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

2020/12/30 06:28

投稿

lah
lah

スコア19

test CHANGED
File without changes
test CHANGED
@@ -158,6 +158,10 @@
158
158
 
159
159
 
160
160
 
161
+ 下記は時系列に対応した状況を示したもの
162
+
163
+
164
+
161
165
  ----------------試したこと------------------------
162
166
 
163
167
  作成したmock_sign_inメソッドについて
@@ -269,3 +273,15 @@
269
273
  error logについて
270
274
 
271
275
  ![error log](ae0a14399edb48e4cf16e096f8cb726d.png)
276
+
277
+
278
+
279
+ -----------RspecのデフォルトのDatabaseCleanerに戻した結果-----------------
280
+
281
+ ```railshelper
282
+
283
+ config.use_transactional_fixtures = true
284
+
285
+ ```
286
+
287
+ 結果、ログの内容は変わリませんでした。

3

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

2020/12/29 13:07

投稿

lah
lah

スコア19

test CHANGED
File without changes
test CHANGED
@@ -158,6 +158,8 @@
158
158
 
159
159
 
160
160
 
161
+ ----------------試したこと------------------------
162
+
161
163
  作成したmock_sign_inメソッドについて
162
164
 
163
165
  ```testhelper
@@ -182,6 +184,10 @@
182
184
 
183
185
 
184
186
 
187
+
188
+
189
+ -----------neko_daisukiさんより頂いた回答について-----------------
190
+
185
191
  indexアクションのテストについて
186
192
 
187
193
  ```usresrequestsspec

2

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

2020/12/29 06:39

投稿

lah
lah

スコア19

test CHANGED
File without changes
test CHANGED
@@ -179,3 +179,87 @@
179
179
  様々なサイト等を参考に落とし込んでみたのですが、、、
180
180
 
181
181
  多分、間違えてます。
182
+
183
+
184
+
185
+ indexアクションのテストについて
186
+
187
+ ```usresrequestsspec
188
+
189
+ describe 'GET #index' do
190
+
191
+ subject { response }
192
+
193
+ # ユーザーのログインの有無を確認
194
+
195
+ describe 'before_action :logged_in_user' do
196
+
197
+ let!(:user) { FactoryBot.create(:user) }
198
+
199
+ # ユーザーがログインしている場合
200
+
201
+ context 'The user is logged in' do
202
+
203
+ before do
204
+
205
+ sign_in(user)
206
+
207
+ get users_path
208
+
209
+ end
210
+
211
+ it 'responds successfully' do
212
+
213
+ is_expected.to be_successful
214
+
215
+ end
216
+
217
+
218
+
219
+ it 'returns a 200 response' do
220
+
221
+ is_expected.to have_http_status(200)
222
+
223
+ end
224
+
225
+ end
226
+
227
+ # ユーザーがログインしていない場合
228
+
229
+ context 'The user is not logged in' do
230
+
231
+ before do
232
+
233
+ get users_path
234
+
235
+ end
236
+
237
+
238
+
239
+ it 'redirect to login url' do
240
+
241
+ is_expected.to redirect_to login_url
242
+
243
+ end
244
+
245
+
246
+
247
+ it 'returns a 302 response' do
248
+
249
+ is_expected.to have_http_status(302)
250
+
251
+ end
252
+
253
+ end
254
+
255
+ end
256
+
257
+ end
258
+
259
+ ```
260
+
261
+ ![indexアクションのログ](838573bcb7aeed032e4dd33241edf008.png)
262
+
263
+ error logについて
264
+
265
+ ![error log](ae0a14399edb48e4cf16e096f8cb726d.png)

1

mock_sign_inメソッドを追記

2020/12/29 06:35

投稿

lah
lah

スコア19

test CHANGED
File without changes
test CHANGED
@@ -155,3 +155,27 @@
155
155
 
156
156
 
157
157
  どんな些細なことでも構いませんので、どなたか教えていただきたいです。
158
+
159
+
160
+
161
+ 作成したmock_sign_inメソッドについて
162
+
163
+ ```testhelper
164
+
165
+ def mock_sign_in(user)
166
+
167
+ mock_ActionDispatch = instance_double(ActionDispatch::Request)
168
+
169
+ allow(mock_ActionDispatch).to receive(:session)
170
+
171
+
172
+
173
+ allow(mock_ActionDispatch).to receive(:session).and_return(user_id: user.id)
174
+
175
+ end
176
+
177
+ ```
178
+
179
+ 様々なサイト等を参考に落とし込んでみたのですが、、、
180
+
181
+ 多分、間違えてます。