mmfkzwtty0505
@mmfkzwtty0505

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

rspecを実行したときに発生したエラーの解決について

解決したいこと

Ruby on RailsでBookのwebページを作成しています。
rspecを実行したところ、ターミナルに以下のエラー文の記載がありました。
解決方法を教えてください。

発生しているエラー

Book モデルに関するテスト
  実際に保存してみる
    有効な投稿内容の場合は保存されるか
  空白のバリデーションチェック
    titleが空白の場合にバリデーションチェックされ空白のエラーメッセージが返ってきているか
    bodyが空白の場合にバリデーションチェックされ空白のエ ラーメッセージが返ってきているか
  titleを空白で投稿した場合に画面にエラーメッセージが表示されているか
    エラーメッセージは正しく表示されるか
  bodyを空白で投稿した場合に画面にエラーメッセージが表示 されているか
    エラーメッセージは正しく表示されるか

投稿のテスト
  トップ画面(root_path)のテスト
    表示の確認
      トップ画面(root_path)に一覧ページへのリンクが表示されているか
      root_pathが"/"であるか
  一覧画面のテスト
    一覧の表示とリンクの確認
      bookの一覧表示(tableタグ)と投稿フォームが同一画面に表示されているか
      bookのタイトルと感想を表示し、詳細・編集・削除のリ ンクが表示されているか
      Create Bookボタンが表示される
    投稿処理に関するテスト
      投稿に成功しサクセスメッセージが表示されるか (FAILED - 1)
      投稿に失敗する
      投稿後のリダイレクト先は正しいか
    book削除のテスト
      application.html.erbにjavascript_pack_tagを含んでいるか
      bookの削除
  詳細画面のテスト
    表示の確認
      本のタイトルと感想が画面に表示されていること
      Editリンクが表示される
      Backリンクが表示される
    リンクの遷移先の確認
      Editの遷移先は編集画面か
      Backの遷移先は一覧画面か
  編集画面のテスト
    表示の確認
      編集前のタイトルと感想がフォームに表示(セット)され ている
      Update Bookボタンが表示される
      Showリンクが表示される
      Backリンクが表示される
    リンクの遷移先の確認
      Showの遷移先は詳細画面か
      Backの遷移先は一覧画面か
    更新処理に関するテスト
      更新に成功しサクセスメッセージが表示されるか
      更新に失敗しエラーメッセージが表示されるか (FAILED - 2)
      更新後のリダイレクト先は正しいか

Failures:

  1) 投稿のテスト 一覧画面のテスト 投稿処理に関するテスト 投稿に成功しサクセスメッセージが表示されるか
     Failure/Error: expect(page).to have_content 'successfully'
       expected to find text "successfully" in "Book was successflly created.\nTitle:l6ukt\nBody:orvqqfdbkogvj2e2skan\nEdit|Back"
     # ./spec/system/books_spec.rb:60:in `block (4 levels) in <main>'

  2) 投稿のテスト 編集画面のテスト 更新処理に関するテスト 更新に失敗しエラーメッセージが表示されるか
     Failure/Error: expect(page).to have_content 'error'
       expected to find text "error" in "Book was successfully updated.\nTitle:hoge\nBody:body\nEdit|Back"
     # ./spec/system/books_spec.rb:170:in `block (4 levels) in <main>'

該当するソースコード

bookers/app/controllers/books_controller.rb
class BooksController < ApplicationController
  def index
    @books=Book.all
    @book=Book.new
  end

  def create
    @book=Book.new(book_params)
    if @book.save
      flash[:notice]="Book was successflly created."
      redirect_to book_path(@book.id)
    else
      @books=Book.all
      render :index
    end
  end

  def show
    @book=Book.find(params[:id])
  end

  def edit
    @book=Book.find(params[:id])
  end

  def destroy
    book=Book.find(params[:id])
    book.destroy
    redirect_to books_path
    flash[:notice] = "Book was successflly destroy." 
  end

  def update
    book=Book.find(params[:id])
    book.update(book_params)
    flash[:notice]="Book was successfully updated."
    redirect_to book_path(book.id)
  end

  private
  def book_params
    params.require(:book).permit(:title, :body)
  end
end
app/views/books/index.html.erb

<h1>Books</h1>

<table>
  <thead>
    <tr>
      <th>Title</th>
      <th>Body</th>
      <th colspan="3"></th>
    </tr>
  </thead>
  
  <tbody>
    <% @books.each do |book| %>
    <tr>
      <td><%=book.title %></td>
      <td><%=book.body %></td>
      <td><%= link_to "Show", book_path(book.id) %></td>
      <td><%=link_to 'Edit',edit_book_path(book.id)%></td>
      <td><%=link_to 'Destroy',book,method: :delete,date: {confirm:"Are you sure?"}%></td>
    </tr>
    <% end %>
  </tbody>
</table>


<h2>New book</h2>

<% if @book.errors.any? %>
  <%= @book.errors.count %>errors prohibited this book from being saved
  <ul>
    <% @book.errors.full_messages.each do |message| %>
      <il><%= message %></il>
    <% end %>
  </ul>
<% end %>

<%=form_with model: @book, url:"/books" do |f| %>
  <div class="text-field">
    <div>Title</div>
    <%= f.text_field :title %>
  </div>
  
  <div class="text-area">
    <div>body</div>
    <%= f.text_area :body %>
  </div>

  <div class="text-submit">
    <%= f.submit 'Create Book' %>
  </div>
<% end %>
app/views/books/show.html.erb

<p>Title:<%=@book.title %></p>

<p>Body:<%=@book.body %></p>

<%= link_to "Edit", edit_book_path(@book.id) %>|<a class ="back" href="/books">Back</a> 
app/views/books/edit.html.erb

<%=f.text_field:title %>

<p>Body</p>
<%= f.text_area :body %>

<p><%= f.submit 'Update Book' %></p>

<% end %>

<%= link_to "Show", book_path(@book.id) %>|<a class ="back" href="/books">Back</a>
0

1Answer

投稿のテスト 一覧画面のテスト 投稿処理に関するテスト 投稿に成功しサクセスメッセージが表示されるか

BooksController#createsuccessfullyの綴りが間違えています

投稿のテスト 編集画面のテスト 更新処理に関するテスト 更新に失敗しエラーメッセージが表示されるか

そもそもエラーを表示させる機構がなさそうに見えます。
単純にパスさせるだけなら以下でいけそうですが、エラーメッセージの詳細表示は適宜追加してください。

def update
  book = Book.find(params[:id])
- book.update(book_params)
- flash[:notice] = "Book was successfully updated."
+ if book.update(book_params)
+   flash[:notice] = "Book was successfully updated."
+ else
+   flash[:notice] = "error."
+ end
  redirect_to book_path(book.id)
end

質問の本質とは関係ないですが、かなり質問文が読みにくいのでマークダウンの書き方の確認をお願いいたします。
https://qiita.com/Qiita/items/c686397e4a0f4f11683d

1Like

Comments

  1. @mmfkzwtty0505

    Questioner

    @h_kono0707
    丁寧な対応ありがとうございます。
    ご指摘いただいた箇所を修正したところ、

    1. 投稿のテスト 一覧画面のテスト 投稿処理に関するテスト 投稿に成功しサクセスメッセージが表示されるか

    の部分がまだ解決できていませんでした。
    これは、create か updateのどちらかに問題があるということでしょうか。
    度々申し訳ございません。

  2. どのように修正したのかと、どのように失敗しているかを教えてください。
    質問文のままでしたら以下の修正を実施して解決しませんか?

    def create
      @book=Book.new(book_params)
      if @book.save
    -   flash[:notice]="Book was successflly created."
    +   flash[:notice]="Book was successfully created."
        redirect_to book_path(@book.id)
      else
        @books=Book.all
        render :index
      end
    end
    

    ついでにdestroyメソッドもsuccessfullysuccessfllyになっています

Your answer might help someone💌