質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

解決済

Rspec で発生したエラーについて

oimo_KENPI
oimo_KENPI

総合スコア10

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1回答

0評価

0クリップ

421閲覧

投稿2022/06/03 10:43

前提

初めての投稿のため、至らぬ記述等ありましたらご教授願います。

現在、「Bookers」というアプリケーションを作成しています。
本のタイトルとその本の内容を「投稿」「編集」「削除」の機能を持ったものです。
その他、必要に応じて別途投稿と一覧画面を行き来します。

ご教授願いたいこと

・Rspec で発生した5つのエラーの対応策
・エラー内容の簡単な詳細

発生している問題・エラーメッセージ

・「rails s」を実行、ブラウザ上では各項目の挙動・動作、レイアウトは問題なく表示されている
・Rspec の際に以下の5つのエラーが発生した

ーー1つ目ーー Books GET /update returns http success Failure/Error: @book = Book.find(params[:id]) ActiveRecord::RecordNotFound: Couldn't find Book with 'id'=update ーー2つ目ーー Books GET /destroy returns http success Failure/Error: @book = Book.find(params[:id]) ActiveRecord::RecordNotFound: Couldn't find Book with 'id'=destroy ーー3つ目ーー Homes GET /top returns http success Failure/Error: get "/homes/top" ActionController::RoutingError: No route matches [GET] "/homes/top" ーー4つ目ーー 投稿のテスト 一覧画面のテスト book削除のテスト application.html.erbにjavascript_pack_tagを含んでいるか Failure/Error: expect(is_exist).to eq(1) expected: 1 got: 0 (compared using ==) ーー5つ目ーー 投稿のテスト 詳細画面のテスト リンクの遷移先の確認 Backの遷移先は一覧画 Failure/Error: expect(page).to have_current_path books_path expected "/books.1" to equal "/books" ーーーーーーー Failed examples: rspec ./spec/requests/books_spec.rb:5 # Books GET /update returns http success rspec ./spec/requests/books_spec.rb:12 # Books GET /destroy returns http success rspec ./spec/requests/homes_spec.rb:5 # Homes GET /top returns http success rspec ./spec/system/books_spec.rb:75 # 投稿のテスト 一覧画面のテスト book削除のテストapplication.html.erbにjavascript_pack_tagを含んでいるか rspec ./spec/system/books_spec.rb:119 # 投稿のテスト 詳細画面のテスト リンクの遷移先の確認 Backの遷移先は一覧画面か

該当のソースコード

books_controller.rb

class BooksController < ApplicationController def new @book = Book.new end def create @book = Book.new(book_params) if @book.save redirect_to book_path(@book.id), notice: 'Book was successfully created.' else @books = Book.all render :index end end def index @books = Book.all @book = Book.new end def show @book = Book.find(params[:id]) end def edit @book = Book.find(params[:id]) end def update @book = Book.find(params[:id]) if @book.update(book_params) redirect_to book_path(@book.id), notice: 'Book was successfully updated.' else render :edit end end def destroy book = Book.find(params[:id]) book.destroy redirect_to books_path, alert: 'Book was successfully destroyed.' end private # ストロングパラメータ def book_params params.require(:book).permit(:title, :body) end end

routes.rb

Rails.application.routes.draw do root :to => 'homes#top' resources :books end

index

<body> <% if flash[:alert] %> <p class="notice"><%= alert %></p> <% end %> <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_path(book.id), method: :delete, "data-confirm" => "本当に削除しますか?" %></td> </tr> <% end %> </tbody> </table> <h2>New book</h2> <% if @book.errors.any? %> <div id="error_explanation"> <h2><%= @book.errors.count %> error prohibited this book from being saved: </h2> <ul> <% @book.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <%= form_with model: @book do |f| %> <div> <label>Title</label> <div class="field"><%= f.text_field :title %></div> </div> <div> <label>Body</label> <div class="field"><%= f.text_area :body %></div> </div> <div class="field"><%= f.submit 'Create Book' %></div> <% end %> </body>

edit.html.erb

<h1>Editing Book</h1> <% if @book.errors.any? %> <div id="error_explanation"> <h2><%= @book.errors.count %> error prohibited this book from being saved:</h2> <ul> <% @book.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <%= form_with model: @book, local:true do |f| %> <div> <!--<div class="field_error">--> <label>Title</label> <div class="field"><%= f.text_field :title %></div> </div> <div> <!--<div class="field_error">--> <label>Body</label> <div class="field"><%= f.text_area :body %></div> </div> <div class="field"><%= f.submit 'Update Book' %></div> <div class="field"> <span class="link_l"><%= link_to "Show", book_path(@book.id) %></span> <span><%= link_to "Back", books_path %></span> </div> <% end %>

show.html.erb

<% if flash[:notice] %> <p class="notice"><%= notice %></p> <% end %> <p><strong>Title:</strong> <%= @book.title %></p> <p><strong>Body:</strong> <%= @book.body %></p> <div class="field"> <span class="link_l"><%= link_to "Edit", edit_book_path(@book.id) %></span> <span><%= link_to "Back", books_path(@book.id) %></span> </div>

application.html.erb

<!DOCTYPE html> <html> <head> <title>Bookers</title> <%= csrf_meta_tags %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> </head> <body> <%= yield %> </body> </html>

試したこと

【エラー1.2】
各種記述、の確認、各挙動の確認
メンターの方に確認したところ、解決できず
【エラー3】
『routes.rb』で「get root :to => 'homes#top'」と記述しており、同様のエラーが発生していた。getを取り消し実行したが、変わらず現在に至る
【エラー4】
『application.html.erb』に「<%= javascript_pack_tag 'application' %>」と追加して見たところ別途エラーが複数発生。使い方を検索したところ、Webpackerのインストールを...とあったたが、わからないものだったため、現状は対応せず
【エラー5】
同じようなエラーの質問があったが特に記述に問題なくわからなかった。※参照

その他

最後までご確認ありがとうございます。
何がわからないかがわからなない状態が多く、エラーの理解や、検索のかけ方が甘かったりと、本投稿の内容が伝わりづらい点が多いこと申し訳ございません。何卒よろしくお願いいたします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

oimo_KENPI

2022/06/03 10:45

スペックが入らなかったのでこちらに追記いたします。 ```books_spec.rb require 'rails_helper' describe '投稿のテスト' do let!(:book) { create(:book,title:'hoge',body:'body') } describe 'トップ画面(root_path)のテスト' do before do visit root_path end context '表示の確認' do it 'トップ画面(root_path)に一覧ページへのリンクが表示されているか' do expect(page).to have_link "", href: books_path end it 'root_pathが"/"であるか' do expect(current_path).to eq('/') end end end describe "一覧画面のテスト" do before do visit books_path end context '一覧の表示とリンクの確認' do it "bookの一覧表示(tableタグ)と投稿フォームが同一画面に表示されているか" do expect(page).to have_selector 'table' expect(page).to have_field 'book[title]' expect(page).to have_field 'book[body]' end it "bookのタイトルと感想を表示し、詳細・編集・削除のリンクが表示されているか" do (1..5).each do |i| Book.create(title:'hoge'+i.to_s,body:'body'+i.to_s) end visit books_path Book.all.each_with_index do |book,i| j = i * 3 expect(page).to have_content book.title expect(page).to have_content book.body # Showリンク show_link = find_all('a')[j] expect(show_link.native.inner_text).to match(/show/i) expect(show_link[:href]).to eq book_path(book) # Editリンク show_link = find_all('a')[j+1] expect(show_link.native.inner_text).to match(/edit/i) expect(show_link[:href]).to eq edit_book_path(book) # Destroyリンク show_link = find_all('a')[j+2] expect(show_link.native.inner_text).to match(/destroy/i) expect(show_link[:href]).to eq book_path(book) end end it 'Create Bookボタンが表示される' do expect(page).to have_button 'Create Book' end end context '投稿処理に関するテスト' do it '投稿に成功しサクセスメッセージが表示されるか' do fill_in 'book[title]', with: Faker::Lorem.characters(number:5) fill_in 'book[body]', with: Faker::Lorem.characters(number:20) click_button 'Create Book' expect(page).to have_content 'successfully' end it '投稿に失敗する' do click_button 'Create Book' expect(page).to have_content 'error' expect(current_path).to eq('/books') end it '投稿後のリダイレクト先は正しいか' do fill_in 'book[title]', with: Faker::Lorem.characters(number:5) fill_in 'book[body]', with: Faker::Lorem.characters(number:20) click_button 'Create Book' expect(page).to have_current_path book_path(Book.last) end end context 'book削除のテスト' do it 'application.html.erbにjavascript_pack_tagを含んでいるか' do is_exist = 0 open("app/views/layouts/application.html.erb").each do |line| strip_line = line.chomp.gsub(" ", "") if strip_line.include?("<%=javascript_pack_tag'application','data-turbolinks-track':'reload'%>") is_exist = 1 break end end expect(is_exist).to eq(1) end it 'bookの削除' do before_delete_book = Book.count click_link 'Destroy' after_delete_book = Book.count expect(before_delete_book - after_delete_book).to eq(1) expect(current_path).to eq('/books') end end end describe '詳細画面のテスト' do before do visit book_path(book) end context '表示の確認' do it '本のタイトルと感想が画面に表示されていること' do expect(page).to have_content book.title expect(page).to have_content book.body end it 'Editリンクが表示される' do edit_link = find_all('a')[0] expect(edit_link.native.inner_text).to match(/edit/i) end it 'Backリンクが表示される' do back_link = find_all('a')[1] expect(back_link.native.inner_text).to match(/back/i) end end context 'リンクの遷移先の確認' do it 'Editの遷移先は編集画面か' do edit_link = find_all('a')[0] edit_link.click expect(current_path).to eq('/books/' + book.id.to_s + '/edit') end it 'Backの遷移先は一覧画面か' do back_link = find_all('a')[1] back_link.click expect(page).to have_current_path books_path end end end describe '編集画面のテスト' do before do visit edit_book_path(book) end context '表示の確認' do it '編集前のタイトルと感想がフォームに表示(セット)されている' do expect(page).to have_field 'book[title]', with: book.title expect(page).to have_field 'book[body]', with: book.body end it 'Update Bookボタンが表示される' do expect(page).to have_button 'Update Book' end it 'Showリンクが表示される' do show_link = find_all('a')[0] expect(show_link.native.inner_text).to match(/show/i) end it 'Backリンクが表示される' do back_link = find_all('a')[1] expect(back_link.native.inner_text).to match(/back/i) end end context 'リンクの遷移先の確認' do it 'Showの遷移先は詳細画面か' do show_link = find_all('a')[0] show_link.click expect(current_path).to eq('/books/' + book.id.to_s) end it 'Backの遷移先は一覧画面か' do back_link = find_all('a')[1] back_link.click expect(page).to have_current_path books_path end end context '更新処理に関するテスト' do it '更新に成功しサクセスメッセージが表示されるか' do fill_in 'book[title]', with: Faker::Lorem.characters(number:5) fill_in 'book[body]', with: Faker::Lorem.characters(number:20) click_button 'Update Book' expect(page).to have_content 'successfully' end it '更新に失敗しエラーメッセージが表示されるか' do fill_in 'book[title]', with: "" fill_in 'book[body]', with: "" click_button 'Update Book' expect(page).to have_content 'error' end it '更新後のリダイレクト先は正しいか' do fill_in 'book[title]', with: Faker::Lorem.characters(number:5) fill_in 'book[body]', with: Faker::Lorem.characters(number:20) click_button 'Update Book' expect(page).to have_current_path book_path(book) end end end end ```

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。