前提
rspecでmod操作をチェックすることができるようになったので、確認ダイアログが表示される操作の統合テストを追加した。(data: { confirm: "削除してよろしいですか?" }
の部分)
しかしその際に、エラーが発生したので、その修正に軌跡をここに記しておくこととする。
ちなみに、RSpecで確認ダイアログを操作するコードは以下を参考にしました。ありがとうございました!!
結論
遷移の前のページが削除される操作の場合、redirect_back
という指示は適切ではない。
エラーの原因とその修正
テストした箇所と、エラーが発生していた部分、その修正。
:
<% if current_user?(@work.user) %>
<div class="work--settings">
<span class="delete_btn field__negative">
<%= link_to "削除する", work_path(@work), method: :delete, data: { confirm: "削除してよろしいですか?" } %>
</span>
</div>
<% end %>
:
class WorksController < ApplicationController
:
def destroy
@work.destroy
flash[:success] = "削除しました。"
- redirect_back(fallback_location: root_url)
+ redirect_to root_url
end
:
require "rails_helper"
RSpec.describe "Create or delete work", type: :system, js: true do
let(:user) { create(:user) }
let(:work) { create(:work, user_id: user.id) }
it "delete work" do
sign_in user
visit work_path work
within(".work--settings") do
expect(page).to have_selector "span.delete_btn"
page.accept_confirm do
click_link "削除する"
end
end
end
end
Create or delete work
delete work (FAILED - 1)
Failures:
1) Create or delete work delete work
Failure/Error:
@work = Work.includes(
[
:user,
comments: :user,
image_attachment: :blob,
illustrations: [photo_attachment: :blob],
]
).find(params[:id])
ActiveRecord::RecordNotFound:
Couldn't find Work with 'id'=3313
# ./app/controllers/works_controller.rb:15:in `show'
:
# ------------------
# --- Caused by: ---
# Capybara::CapybaraError:
# Your application server raised an error - It has been raised in your test code because Capybara.raise_server_errors == true
# /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/session.rb:160:in `raise_server_error!'
Finished in 5.17 seconds (files took 3.93 seconds to load)
1 example, 1 failure
原因
原因は削除操作にて、redirect_back(fallback_location: root_url)
という、redirect_back
の操作を行っていた事に由来します。
class WorksController < ApplicationController
:
def destroy
@work.destroy
flash[:success] = "削除しました。"
- redirect_back(fallback_location: root_url)
+ redirect_to root_url
end
:
fallback_location
というオプションは遷移前のページのURL取得する操作でした。しかし、遷移の前のページ(今回でいうworks/show.html.erb
)が削除される操作の場合は、そもそもredirect_back
という指示は適切なはずがなく、エラーが発生していました。
ちなみにこの修正は、以下の記事を参考にしました。ありがとうございました!
つまり、自分のアプリケーションにはエラーが発生するコードが、常に内在していた、と言うことになります。情けない、、
改めてテストの重要性に気付かされました。
今回の記事は以上です、最後まで読んでいただきありがとうございました!!