質問編集履歴
6
自己解決した経緯について追記・タイトルの修正
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
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
|
+

|
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対策について行ったことを記述
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に戻した結果
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
|

|
135
137
|
error logについて
|
136
|
-

|
138
|
+

|
139
|
+
|
140
|
+
-----------RspecのデフォルトのDatabaseCleanerに戻した結果-----------------
|
141
|
+
```railshelper
|
142
|
+
config.use_transactional_fixtures = true
|
143
|
+
```
|
144
|
+
結果、ログの内容は変わリませんでした。
|
3
経過状況がわかるように修正
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
回答のあった件について、追加情報
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
|
+

|
132
|
+
error logについて
|
133
|
+

|
1
mock_sign_inメソッドを追記
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
|
+
多分、間違えてます。
|