回答編集履歴

3

回答を追記しました

2021/02/27 09:04

投稿

jnchito
jnchito

スコア357

test CHANGED
@@ -109,3 +109,161 @@
109
109
 
110
110
 
111
111
  以上、参考になれば幸いです。
112
+
113
+
114
+
115
+ ## コメントを受けての追記
116
+
117
+
118
+
119
+ > それが`project_tasks/url(@project)`にしているのですが、上記のようなエラーが出てしまいます。
120
+
121
+ > 該当のコードのURLは以下のようになります
122
+
123
+ > https://github.com/YouheiNozaki/Everyday-rails-v6/blob/main/spec/requests/tasks_request_spec.rb
124
+
125
+
126
+
127
+ コードの共有ありがとうございます!これだと手元でもエラーを再現できるので非常に助かります。
128
+
129
+ というわけで、僕もローカルで再現させてみました。
130
+
131
+
132
+
133
+ これ、前回のコメントですっかり見落としていましたが、RSpec側のパスではなく、Viewに書かれたパスの間違いですね。
134
+
135
+ しかも、ryusouさんの間違いではなくオリジナルのサンプルコードの間違いです。(Oh...????)
136
+
137
+
138
+
139
+ [https://github.com/everydayrails/everydayrails-rspec-2017/blob/90b22535d44ab626b82363335a227c5a1856a039/app/views/tasks/_task.json.jbuilder#L2](https://github.com/everydayrails/everydayrails-rspec-2017/blob/90b22535d44ab626b82363335a227c5a1856a039/app/views/tasks/_task.json.jbuilder#L2)
140
+
141
+
142
+
143
+ 正しくはこうですね。
144
+
145
+
146
+
147
+ ```diff
148
+
149
+ -json.url project_task_url([task.project, task], format: :json)
150
+
151
+ +json.url project_task_url(task.project, task, format: :json)
152
+
153
+ ```
154
+
155
+
156
+
157
+ こうすればテストはパスするはずです。
158
+
159
+
160
+
161
+ ### コントローラースペックでエラーが起きなかった理由
162
+
163
+
164
+
165
+ ではなぜViewに不具合があったのにコントローラースペックの方はパスしたのでしょうか?
166
+
167
+ これはコントローラースペックはデフォルトでViewをレンダリングしないためです。
168
+
169
+ そのため、コントローラースペックという名前の通り「コントローラーは異常なし!だからヨシ!(Viewは知らん!)」となってしまったわけです。
170
+
171
+
172
+
173
+ ただし、`render_views`というメソッドを呼びだしておくと、コントローラースペックでもViewのレンダリングを強制することができます。
174
+
175
+ こうするとコントローラースペックでもエラーが発生するようになります。
176
+
177
+
178
+
179
+ ```diff
180
+
181
+ require 'rails_helper'
182
+
183
+
184
+
185
+ RSpec.describe TasksController, type: :controller do
186
+
187
+ + render_views
188
+
189
+ include_context "project setup"
190
+
191
+ ```
192
+
193
+
194
+
195
+ 実行結果
196
+
197
+
198
+
199
+ ```
200
+
201
+ Failures:
202
+
203
+
204
+
205
+ 1) TasksController#create responds with JSON formatted output
206
+
207
+ Failure/Error: json.url project_task_url([task.project, task], format: :json)
208
+
209
+
210
+
211
+ ActionView::Template::Error:
212
+
213
+ No route matches {:action=>"show", :controller=>"tasks", :format=>:json, :project_id=>[#<Project id: 1, name: "Project 2", description: "A test project.", due_on: "2021-03-06", created_at: "2021-02-27 07:53:57.565109000 +0000", updated_at: "2021-02-27 07:53:57.565109000 +0000", user_id: 1, completed: nil>, #<Task id: 1, name: "New test task", project_id: 1, completed: nil, created_at: "2021-02-27 07:53:57.574235000 +0000", updated_at: "2021-02-27 07:53:57.574235000 +0000">]}, missing required keys: [:id]
214
+
215
+ Did you mean? project_tasks_url
216
+
217
+ project_task_path
218
+
219
+ project_tasks_path
220
+
221
+ new_project_task_url
222
+
223
+ # ./app/views/tasks/_task.json.jbuilder:2:in `_app_views_tasks__task_json_jbuilder___3745737086157069224_66100'
224
+
225
+ # ./app/views/tasks/show.json.jbuilder:1:in `_app_views_tasks_show_json_jbuilder__4444021816594691676_66060'
226
+
227
+ # ./app/controllers/tasks_controller.rb:34:in `block (2 levels) in create'
228
+
229
+ # ./app/controllers/tasks_controller.rb:31:in `create'
230
+
231
+ # ./spec/controllers/tasks_controller_spec.rb:20:in `block (3 levels) in <top (required)>'
232
+
233
+ # ------------------
234
+
235
+ # --- Caused by: ---
236
+
237
+ # ActionController::UrlGenerationError:
238
+
239
+ # No route matches {:action=>"show", :controller=>"tasks", :format=>:json, :project_id=>[#<Project id: 1, name: "Project 2", description: "A test project.", due_on: "2021-03-06", created_at: "2021-02-27 07:53:57.565109000 +0000", updated_at: "2021-02-27 07:53:57.565109000 +0000", user_id: 1, completed: nil>, #<Task id: 1, name: "New test task", project_id: 1, completed: nil, created_at: "2021-02-27 07:53:57.574235000 +0000", updated_at: "2021-02-27 07:53:57.574235000 +0000">]}, missing required keys: [:id]
240
+
241
+ # Did you mean? project_tasks_url
242
+
243
+ # project_task_path
244
+
245
+ # project_tasks_path
246
+
247
+ # new_project_task_url
248
+
249
+ # ./app/views/tasks/_task.json.jbuilder:2:in `_app_views_tasks__task_json_jbuilder___3745737086157069224_66100'
250
+
251
+ ```
252
+
253
+
254
+
255
+ `rails s`で起動したサンプルアプリケーションではTaskの作成はJSONではなくHTMLリクエストで実行されることもあり、JSONレスポンスに不具合が隠れていることを検知できていませんでした。どうもすみません????‍♂️
256
+
257
+
258
+
259
+ というわけで、この件は原著者のAaronさんにフィードバックしておきました。
260
+
261
+
262
+
263
+ [\_task.json.jbuilder has invalid arguments for project\_task\_url · Issue \#112 · everydayrails/everydayrails\-rspec\-2017](https://github.com/everydayrails/everydayrails-rspec-2017/issues/112)
264
+
265
+
266
+
267
+ おかげさまで長年誰も気づいていなかった不具合を見つけることができました。
268
+
269
+ どうもありがとうございました!!

2

post先のURLを修正

2021/02/27 09:04

投稿

jnchito
jnchito

スコア357

test CHANGED
@@ -102,7 +102,7 @@
102
102
 
103
103
  ```ruby
104
104
 
105
- post tasks_url(@project), headers: headers, params: { task: new_task }
105
+ post project_tasks_url(@project), headers: headers, params: { task: new_task }
106
106
 
107
107
  ```
108
108
 

1

changed URL

2021/02/27 07:24

投稿

jnchito
jnchito

スコア357

test CHANGED
@@ -92,7 +92,7 @@
92
92
 
93
93
 
94
94
 
95
- https://github.com/JunichiIto/everydayrails-rspec-2017/blob/63e38f87c8edfdfb5861fa628429651f62c8492e/app/controllers/projects_controller.rb#L83
95
+ [https://github.com/everydayrails/everydayrails-rspec-2017/blob/63e38f87c8edfdfb5861fa628429651f62c8492e/app/controllers/projects_controller.rb#L83](https://github.com/everydayrails/everydayrails-rspec-2017/blob/63e38f87c8edfdfb5861fa628429651f62c8492e/app/controllers/projects_controller.rb#L83)
96
96
 
97
97
 
98
98