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

質問編集履歴

3

問題の追加

2021/03/02 05:19

投稿

paserin
paserin

スコア4

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,7 @@
1
1
  ### 発生している問題・エラーメッセージ
2
2
 
3
3
  3つエラーが出てしまうのですが、完全に行き詰ってしまったので、なぜこのエラーが出ているのか、解決策を教えて頂きたいです。
4
+ 新規投稿のフォームが空欄だとエラー文が出るように書いているのですが、titleとbodyの両方に入力をしたにもかかわらずエラー文が出力されるようになってしまい、新規投稿が出来ない状態になっています。
4
5
  ```
5
6
 
6
7
  Failures:

2

テストコードを追記しました

2021/03/02 05:19

投稿

paserin
paserin

スコア4

title CHANGED
@@ -1,1 +1,1 @@
1
- rails」Rspecで表示されたエラー内容について
1
+ rails」Rspecで表示されたエラー内容について
body CHANGED
File without changes

1

テストコードを追記しました 文字制限があったので多少省きました。

2021/03/02 05:08

投稿

paserin
paserin

スコア4

title CHANGED
File without changes
body CHANGED
@@ -1,74 +1,8 @@
1
- ### 前提・実現したいこと
2
-
3
- railsで以下の要件に沿ったアプリケーションを作っています。
4
-
5
- ・本の感想投稿へのCRUD機能
6
- ・感想投稿の際、本のタイトルと感想に入力がなされていない場合、登録不可とする(validationの設定)
7
- ・scaffoldの使用禁止。
8
- ・localhost:3000/のURLを叩いた時にTOP画面が表示される(ルーティングの設定)
9
- ・テーブル名は"posts",カラムは"title","body"でモデルを作成
10
- ・ストロングパラメータを用いる
11
- ・新規投稿または投稿の編集を行うと投稿した詳細画面(show.html.erb)に飛ぶ
12
-
13
- 【レイアウト】
14
- ・新規投稿フォームと投稿一覧表示を同一のページ内に置く
15
-
16
- 【デザイン】
17
- ・一覧部分にtableを用いる
18
-
19
1
  ### 発生している問題・エラーメッセージ
20
2
 
21
- 3つエラーが出てしまうのですが、完全に行き詰ってしまったので解決策を教えて頂きたいです。
3
+ 3つエラーが出てしまうのですが、完全に行き詰ってしまったので、なぜこのエラーが出ているのか、解決策を教えて頂きたいです。
22
4
  ```
23
- Book モデルに関するテスト
24
- 実際に保存してみる
25
- 有効な投稿内容の場合は保存されるか
26
- 空白のバリデーションチェック
27
- titleが空白の場合にバリデーションチェックされ空白のエラーメッセージが返ってきているか
28
- bodyが空白の場合にバリデーションチェックされ空白のエラーメッセージが返ってきているか
29
- titleを空白で投稿した場合に画面にエラーメッセージが表示されているか
30
- エラーメッセージは正しく表示されるか
31
- bodyを空白で投稿した場合に画面にエラーメッセージが表示されているか
32
- エラーメッセージは正しく表示されるか
33
5
 
34
- 投稿のテスト
35
- トップ画面(root_path)のテスト
36
- 表示の確認
37
- トップ画面(root_path)に一覧ページへのリンクが表示されているか
38
- root_pathが"/"であるか
39
- 一覧画面のテスト
40
- 一覧の表示とリンクの確認
41
- bookの一覧表示(tableタグ)と投稿フォームが同一画面に表示されているか
42
- bookのタイトルと感想を表示し、詳細・編集・削除のリンクが表示されているか
43
- Create Bookボタンが表示される
44
- 投稿処理に関するテスト
45
- 投稿に成功しサクセスメッセージが表示されるか (FAILED - 1)
46
- 投稿に失敗する
47
- 投稿後のリダイレクト先は正しいか (FAILED - 2)
48
- book削除のテスト
49
- bookの削除
50
- 詳細画面のテスト
51
- 表示の確認
52
- 本のタイトルと感想が画面に表示されていること
53
- Editリンクが表示される
54
- Backリンクが表示される
55
- リンクの遷移先の確認
56
- Editの遷移先は編集画面か
57
- Backの遷移先は一覧画面か
58
- 編集画面のテスト
59
- 表示の確認
60
- 編集前のタイトルと感想がフォームに表示(セット)されている
61
- Update Bookボタンが表示される
62
- Showリンクが表示される
63
- Backリンクが表示される
64
- リンクの遷移先の確認
65
- Showの遷移先は詳細画面か
66
- Backの遷移先は一覧画面か
67
- 更新処理に関するテスト
68
- 更新に成功しサクセスメッセージが表示されるか
69
- 更新に失敗しエラーメッセージが表示されるか (FAILED - 3)
70
- 更新後のリダイレクト先は正しいか
71
-
72
6
  Failures:
73
7
 
74
8
  1) 投稿のテスト 一覧画面のテスト 投稿処理に関するテスト 投稿に成功しサクセスメッセージが表示されるか
@@ -86,27 +20,11 @@
86
20
  expected to find text "error" in "Book was successfully updated.\nTitle: hoge\nBody: body\nEdit Back"
87
21
  # ./spec/system/books_spec.rb:156:in `block (4 levels) in <main>'
88
22
 
89
- Finished in 0.76962 seconds (files took 0.98823 seconds to load)
90
- 28 examples, 3 failures
91
-
92
- Failed examples:
93
-
94
- rspec ./spec/system/books_spec.rb:56 # 投稿のテスト 一覧画面のテスト 投稿処理に関するテスト 投稿に成功しサクセスメッセージが表示されるか
95
- rspec ./spec/system/books_spec.rb:67 # 投稿のテスト 一覧画面のテスト 投稿処理に関するテスト 投稿後のリダイレクト先は正しいか
96
- rspec ./spec/system/books_spec.rb:152 # 投稿のテスト 編集画面のテスト 更新処理に関するテスト 更新に失敗しエラーメッセージが表示されるか
97
-
98
23
  ```
99
24
 
100
25
  ### 該当のソースコード
101
26
 
102
- homes_controller.rb
103
- ```
104
- class HomesController < ApplicationController
105
27
 
106
- def top
107
- end
108
- end
109
- ```
110
28
  books_controller.rb
111
29
  ```
112
30
  class BooksController < ApplicationController
@@ -243,20 +161,14 @@
243
161
  <%= link_to "show", book_path(@book) %>
244
162
  <%= link_to "Back", books_path %>
245
163
  ```
246
- index.html.erb
164
+ show.html.erb
247
165
  ```
248
166
  <p>Title: <%= @book.title %></p>
249
167
  <p>Body: <%= @book.body%></p>
250
168
  <%= link_to "Edit", edit_book_path(@book) %>
251
169
  <%= link_to "Back", books_path %>
252
170
  ```
253
- index.html.erb
171
+
254
- ```
255
- <h1>ようこそBookersへ!</h1>
256
- <p>Bookers では、さまざまな書籍に関するあなたの意見や</p>
257
- <p>印象を共有し交換することができます</p>
258
- <p><%= link_to "start", books_path %></p>
259
- ```
260
172
  routes.rb
261
173
  ```
262
174
  Rails.application.routes.draw do
@@ -265,34 +177,173 @@
265
177
  root to: 'homes#top'
266
178
  end
267
179
  ```
180
+
268
- application.html.erb
181
+ テストコード
269
182
  ```
270
- <!DOCTYPE html>
271
- <html>
272
- <head>
273
- <title>BookerApp</title>
183
+ require 'rails_helper'
274
- <%= csrf_meta_tags %>
275
- <%= csp_meta_tag %>
276
184
 
277
- <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
278
- <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
279
- </head>
280
-
281
- <body>
282
- <% if flash[:notice] %>
283
- <p id="notice">
284
- <%= flash[:notice] %>
285
- </p>
286
- <% end %>
287
- <%= yield %>
288
- </body>
289
- </html>
290
- ```
291
- book.rb
292
- ```
293
- class Book < ApplicationRecord
294
- validates :title, presence: true
295
- validates :body, presence: true
185
+ describe '投稿のテスト' do
186
+ let!(:book) { create(:book,title:'hoge',body:'body') }
187
+ describe 'トップ画面(root_path)のテスト' do
188
+ before do
189
+ visit root_path
190
+ end
191
+ context '表示の確認' do
192
+ it 'トップ画面(root_path)に一覧ページへのリンクが表示されているか' do
193
+ expect(page).to have_link "", href: books_path
194
+ end
195
+ it 'root_pathが"/"であるか' do
196
+ expect(current_path).to eq('/')
197
+ end
198
+ end
199
+ end
200
+ describe "一覧画面のテスト" do
201
+ before do
202
+ visit books_path
203
+ end
204
+ context '一覧の表示とリンクの確認' do
205
+ it "bookの一覧表示(tableタグ)と投稿フォームが同一画面に表示されているか" do
206
+ expect(page).to have_selector 'table'
207
+ expect(page).to have_field 'book[title]'
208
+ expect(page).to have_field 'book[body]'
209
+ end
210
+ it "bookのタイトルと感想を表示し、詳細・編集・削除のリンクが表示されているか" do
211
+ (1..5).each do |i|
212
+ Book.create(title:'hoge'+i.to_s,body:'body'+i.to_s)
213
+ end
214
+ visit books_path
215
+ Book.all.each_with_index do |book,i|
216
+ j = i * 3
217
+ expect(page).to have_content book.title
218
+ expect(page).to have_content book.body
219
+ # Showリンク
220
+ show_link = find_all('a')[j]
221
+ expect(show_link.native.inner_text).to match(/show/i)
222
+ expect(show_link[:href]).to eq book_path(book)
223
+ # Editリンク
224
+ show_link = find_all('a')[j+1]
225
+ expect(show_link.native.inner_text).to match(/edit/i)
226
+ expect(show_link[:href]).to eq edit_book_path(book)
227
+ # Destroyリンク
228
+ show_link = find_all('a')[j+2]
229
+ expect(show_link.native.inner_text).to match(/destroy/i)
230
+ expect(show_link[:href]).to eq book_path(book)
231
+ end
232
+ end
233
+ it 'Create Bookボタンが表示される' do
234
+ expect(page).to have_button 'Create Book'
235
+ end
236
+ end
237
+ context '投稿処理に関するテスト' do
238
+ it '投稿に成功しサクセスメッセージが表示されるか' do
239
+ fill_in 'book[title]', with: Faker::Lorem.characters(number:5)
240
+ fill_in 'book[body]', with: Faker::Lorem.characters(number:20)
241
+ click_button 'Create Book'
242
+ expect(page).to have_content 'successfully'
243
+ end
244
+ it '投稿に失敗する' do
245
+ click_button 'Create Book'
246
+ expect(page).to have_content 'error'
247
+ expect(current_path).to eq('/books')
248
+ end
249
+ it '投稿後のリダイレクト先は正しいか' do
250
+ fill_in 'book[title]', with: Faker::Lorem.characters(number:5)
251
+ fill_in 'book[body]', with: Faker::Lorem.characters(number:20)
252
+ click_button 'Create Book'
253
+ expect(page).to have_current_path book_path(Book.last)
254
+ end
255
+ end
256
+ context 'book削除のテスト' do
257
+ it 'bookの削除' do
258
+ expect{ book.destroy }.to change{ Book.count }.by(-1)
259
+ # ※本来はダイアログのテストまで行うがココではデータが削除されることだけをテスト
260
+ end
261
+ end
262
+ end
263
+ describe '詳細画面のテスト' do
264
+ before do
265
+ visit book_path(book)
266
+ end
267
+ context '表示の確認' do
268
+ it '本のタイトルと感想が画面に表示されていること' do
269
+ expect(page).to have_content book.title
270
+ expect(page).to have_content book.body
271
+ end
272
+ it 'Editリンクが表示される' do
273
+ edit_link = find_all('a')[0]
274
+ expect(edit_link.native.inner_text).to match(/edit/i)
275
+ end
276
+ it 'Backリンクが表示される' do
277
+ back_link = find_all('a')[1]
278
+ expect(back_link.native.inner_text).to match(/back/i)
279
+ end
280
+ end
281
+ context 'リンクの遷移先の確認' do
282
+ it 'Editの遷移先は編集画面か' do
283
+ edit_link = find_all('a')[0]
284
+ edit_link.click
285
+ expect(current_path).to eq('/books/' + book.id.to_s + '/edit')
286
+ end
287
+ it 'Backの遷移先は一覧画面か' do
288
+ back_link = find_all('a')[1]
289
+ back_link.click
290
+ expect(page).to have_current_path books_path
291
+ end
292
+ end
293
+ end
294
+ describe '編集画面のテスト' do
295
+ before do
296
+ visit edit_book_path(book)
297
+ end
298
+ context '表示の確認' do
299
+ it '編集前のタイトルと感想がフォームに表示(セット)されている' do
300
+ expect(page).to have_field 'book[title]', with: book.title
301
+ expect(page).to have_field 'book[body]', with: book.body
302
+ end
303
+ it 'Update Bookボタンが表示される' do
304
+ expect(page).to have_button 'Update Book'
305
+ end
306
+ it 'Showリンクが表示される' do
307
+ show_link = find_all('a')[0]
308
+ expect(show_link.native.inner_text).to match(/show/i)
309
+ end
310
+ it 'Backリンクが表示される' do
311
+ back_link = find_all('a')[1]
312
+ expect(back_link.native.inner_text).to match(/back/i)
313
+ end
314
+ end
315
+ context 'リンクの遷移先の確認' do
316
+ it 'Showの遷移先は詳細画面か' do
317
+ show_link = find_all('a')[0]
318
+ show_link.click
319
+ expect(current_path).to eq('/books/' + book.id.to_s)
320
+ end
321
+ it 'Backの遷移先は一覧画面か' do
322
+ back_link = find_all('a')[1]
323
+ back_link.click
324
+ expect(page).to have_current_path books_path
325
+ end
326
+ end
327
+ context '更新処理に関するテスト' do
328
+ it '更新に成功しサクセスメッセージが表示されるか' do
329
+ fill_in 'book[title]', with: Faker::Lorem.characters(number:5)
330
+ fill_in 'book[body]', with: Faker::Lorem.characters(number:20)
331
+ click_button 'Update Book'
332
+ expect(page).to have_content 'successfully'
333
+ end
334
+ it '更新に失敗しエラーメッセージが表示されるか' do
335
+ fill_in 'book[title]', with: ""
336
+ fill_in 'book[body]', with: ""
337
+ click_button 'Update Book'
338
+ expect(page).to have_content 'error'
339
+ end
340
+ it '更新後のリダイレクト先は正しいか' do
341
+ fill_in 'book[title]', with: Faker::Lorem.characters(number:5)
342
+ fill_in 'book[body]', with: Faker::Lorem.characters(number:20)
343
+ click_button 'Update Book'
344
+ expect(page).to have_current_path book_path(book)
345
+ end
346
+ end
347
+ end
296
348
  end
297
-
298
349
  ```