こんにちは。Tomoyuki(@tomoyuki65)です。
最近、「Everyday Rails – RSpecによるRailsテスト入門」という書籍を利用してRSpecの学習を進めています。
その中で、“コントローラスペックをリクエストスペックに置き換える”という部分で少し躓きましたが、なんとか解決できました。
ということで、私が躓いた部分と解決方法について記録を残しておきます。
関連記事👇
コントローラスペックをリクエストスペックで置き換える際の注意点【Everyday Rails – RSpecによるRailsテスト入門の参考資料】
躓いた部分
「7章 リクエストスペックでAPIをテストする」の「コントローラスペックをリクエストスペックに置き換える」という部分を学習後、試しに5章で取り扱った「projects_controller_spec.rb」をリクエストスペックの「projects_spec.rb」に置き換えてみることを試しました。
その際に、「projects_controller_spec.rb」の「describe “#show” do 〜 end」にある「# 認可されていないユーザーとして」の部分をリクエストスペックに置き換えようと試みました。
describe "#show" do
# 認可されたユーザーとして
〜省略〜
# 認可されていないユーザーとして
context "as an unauthorized user" do
before do
@user = FactoryBot.create(:user)
other_user = FactoryBot.create(:user)
@project = FactoryBot.create(:project, owner: other_user)
end
# ダッシュボードにリダイレクトすること
it "redirects to the dashboard" do
sign_in @user
get :show, params: { id: @project.id }
expect(response).to redirect_to root_path
end
end
end
コントローラスペックをリクエストスペックに置き換える際は、コントローラのアクション部分については、具体的なルーティング名を指定する必要があるということで、「get :show → get projects_path」に変更してテストを実行してみました。
describe "#show" do
# 認可されたユーザーとして
〜省略〜
# 認可されていないユーザーとして
context "as an unauthorized user" do
before do
@user = FactoryBot.create(:user)
other_user = FactoryBot.create(:user)
@project = FactoryBot.create(:project, owner: other_user)
end
# ダッシュボードにリダイレクトすること
it "redirects to the dashboard" do
sign_in @user
get projects_path, params: { id: @project.id }
expect(response).to redirect_to root_path
end
end
end
すると、以下のようなエラーメッセージが出て、期待通りの結果にはなりませんでした。
Failures:
1) Projects #show as an unauthorized user redirects to the dashboard
Failure/Error: expect(response).to redirect_to root_path
Expected response to be a <3XX: redirect>, but was a <200: OK>
どうやら、「get projects_path, params: { id: @project.id }」の結果としてステータス「200」が返ってきていて、リダイレクトされていない模様。。
解決方法
色々調べた結果(数時間経過。。)、具体的には「get projects_path, params: { id: @project.id }」の記述が間違っていることがわかりました。
解決方法としては、リクエストスペックでは具体的なルーティング名を指定する必要があるため、今回の例ではコントローラのshowアクションのルーティングを確認する必要がありました。
そこで、ターミナルで以下のコマンドを実行し、ルーティングの一覧を表示して確認します。
$ rails routes
Prefix Verb URI Pattern Controller@Action
〜 省略 〜
projects GET /projects(.:format) projects#index
POST /projects(.:format) projects#create
new_project GET /projects/new(.:format) projects#new
edit_project GET /projects/:id/edit(.:format) projects#edit
project GET /projects/:id(.:format) projects#show
PATCH /projects/:id(.:format) projects#update
PUT /projects/:id(.:format) projects#update
DELETE /projects/:id(.:format) projects#delete
〜 省略 〜
実行結果を確認すると、コントローラのshowアクションについては、Prefixが「project」になっているため、指定するルーティングは「project_path」になります。
加えて、showアクションではidも一緒に渡す必要があるため、ここでは「project_path(対象のプロジェクトのid)」を指定するのが正しい記述になります。
よって、リクエストスペックを修正すると次のようになります。
describe "#show" do
# 認可されたユーザーとして
〜省略〜
# 認可されていないユーザーとして
context "as an unauthorized user" do
before do
@user = FactoryBot.create(:user)
other_user = FactoryBot.create(:user)
@project = FactoryBot.create(:project, owner: other_user)
end
# ダッシュボードにリダイレクトすること
it "redirects to the dashboard" do
sign_in @user
get project_path(@project.id)
expect(response).to redirect_to root_path
end
end
end
リクエストスペック修正後にテストを実行すると以下のような結果になり、無事問題を解決できました。
Projects #show as an authorized user responds successfully as an unauthorized user redirects to the dashboard Finished in 0.48561 seconds (files took 1.42 seconds to load) 2 examples, 0 failures
最後に
今回はRSpecのコントローラスペックをリクエストスペックに置き換える際の注意点につい記録を残しておきました。
私がこの問題に躓いた際には、ググってもなかなか解決方法が見つからなかったため、同じような問題で躓いている方がいたらぜひ参考にしてみて下さい。
Tomoyuki
最新記事 by Tomoyuki (全て見る)
- Go言語(Golang)専門の技術ブログ「Golang-Tech」を開設!? - 2024年9月26日
- 【2024年】モンハンワイルズの推奨スペックとおすすめのゲーミングPCを紹介! - 2024年9月26日
- 37歳Web系エンジニア3年目。生成AI(ChatGPT・Gemini)現る。 - 2024年7月3日
コメントを残す