コントローラスペックをリクエストスペックで置き換える際の注意点【Everyday Rails – RSpecによるRailsテスト入門の参考資料】


 

こんにちは。Tomoyuki(@tomoyuki65)です。

最近、Everyday Rails – RSpecによるRailsテスト入門という書籍を利用してRSpecの学習を進めています。

その中で、“コントローラスペックをリクエストスペックに置き換える”という部分で少し躓きましたが、なんとか解決できました。

ということで、私が躓いた部分と解決方法について記録を残しておきます。

 

関連記事👇

Leanpubで「Everyday Rails – RSpecによるRailsテスト入門」の買い方・購入方法

2019年4月25日

 



コントローラスペックをリクエストスペックで置き換える際の注意点【Everyday Rails – RSpecによるRailsテスト入門の参考資料】

躓いた部分

「7章 リクエストスペックでAPIをテストする」の「コントローラスペックをリクエストスペックに置き換える」という部分を学習後、試しに5章で取り扱った「projects_controller_spec.rb」をリクエストスペックの「projects_spec.rb」に置き換えてみることを試しました。

その際に、「projects_controller_spec.rb」の「describe “#show” do 〜 end」にある「# 認可されていないユーザーとして」の部分をリクエストスペックに置き換えようと試みました。

/spec/controllers/projects_controller_spec.rbの対象部分

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」に変更してテストを実行してみました。

/spec/requests/projects_spec.rbに置き換えてみた例

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

 

すると、以下のようなエラーメッセージが出て、期待通りの結果にはなりませんでした。

/spec/requests/projects_spec.rb実行時のエラーメッセージ

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アクションのルーティングを確認する必要がありました。

そこで、ターミナルで以下のコマンドを実行し、ルーティングの一覧を表示して確認します。

Macのターミナルでのコマンド実行例(ルーティングの確認)

$ rails routes
実行結果(projects部分を抜粋)

      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)」を指定するのが正しい記述になります。

よって、リクエストスペックを修正すると次のようになります。

/spec/requests/projects_spec.rbの修正例

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のコントローラスペックをリクエストスペックに置き換える際の注意点につい記録を残しておきました。

私がこの問題に躓いた際には、ググってもなかなか解決方法が見つからなかったため、同じような問題で躓いている方がいたらぜひ参考にしてみて下さい。

 

各種SNSなど

各種SNSなど、チャンネル登録やフォローをしていただけると励みになるので、よければぜひお願いします!

 

The following two tabs change content below.

Tomoyuki

SEを5年経験後、全くの未経験ながら思い切ってブロガーに転身し、月間13万PVを達成。その後コロナの影響も受け、以前から興味があったWeb系エンジニアへのキャリアチェンジを決意。現在はWeb系エンジニアとして働きながら、プロゲーマーとしても活躍できるように活動中。








シェアはこちらから


おすすめのゲーミングPCまとめ

近年、eスポーツという言葉が浸透し、ゲーミングPCの需要も増えましたが、「ゲーミングPCはどう選べばいいの?」という人も多いのではないでしょうか。そんなPC初心者でも迷わず選べるよう、おすすめのゲーミングPCをご紹介します!


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です