5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsでコントローラーの単体テストコード時に「302」のエラーが出た時の対処法

Posted at

#はじめに

前回の記事の続きってわけでも無いのですが、似たような内容にはなっています。
それと「302」のエラーの中のあくまでも1例ですのでよろしく御願い致します。

#エラー内容
それではまずはコントローラーの単体テストコード実装時に下記のようなエラーが出ました。
ご覧ください

ターミナル

 % bundle exec rspec spec/requests/orders_spec.rb

OrdersController
  GET /index
    indexアクションにリクエストすると正常にレスポンスが返ってくる (FAILED - 1)
    indexアクションにリクエストするとレスポンスに出品済みの商品の説明文が存在する (FAILED - 2)


Failures:

  1) OrdersController GET /index indexアクションにリクエストすると正常にレスポンスが返ってくる
     Failure/Error: expect(response.status).to eq 200
     
       expected: 200
            got: 302
     
       (compared using ==)
     # ./spec/requests/orders_spec.rb:24:in `block (3 levels) in <top (required)>'

  2) OrdersController GET /index indexアクションにリクエストするとレスポンスに出品済みの商品の説明文が存在する
     Failure/Error: expect(response.body).to include @item.details
       expected "<html><body>You are being <a href=\"http://www.example.com/users/sign_in\">redirected</a>.</body></html>" to include "商品の説明"
     # ./spec/requests/orders_spec.rb:29:in `block (3 levels) in <top (required)>'

〜中略〜

#エラー内容の検証
それではエラー内容を検証していきたいと思います。
今回のエラーの原因となる該当箇所は2つあります。
まず1つ目は下記の部分です。

ターミナル

  1)   Failure/Error: expect(response.status).to eq 200
     
       expected: 200
            got: 302

次に2つ目は下記の部分です。

ターミナル
  2)   Failure/Error: expect(response.body).to include @item.details

        expected "<html><body>You are being <a href=\"http://www.example.com/users/sign_in\">redirected</a>.</body></html>" to include "商品の説明"

#エラー内容の検証
それではエラー内容の検証をしていきます。

  • まず1つ目のエラーはexpectedで**「200」(成功)を期待していますが実際に返ってきたレスポンスは「302」(Found)となっています。
    ここで
    「302」(Found)**についての詳しい説明を載せておきます。

#302 (Found) エラーとは

「The HyperText Transfer Protocol (HTTP) の 302 Found リダイレクトステータスレスポンスコードは、リクエストされたリソースが一時的に Location で示された URL へ移動したことを示します。ブラウザーはこのページにリダイレクトしますが、検索エンジンはリソースへのリンクを更新しません 。」

上記を簡単に説明しますと「本来遷移したいページではなく違うページにリダイレクトされましたよ」という内容です。

(引用させて頂いた参考サイト)
HTTP レスポンスステータスコードについての参考サイト


  • それでは次に2つ目のエラーですが自分が着目したポイントは下記の部分です。

<a href=\"http://www.example.com/users/sign_in\">redirected</a>.

まず**「users/sign_in」とあるのでログイン画面が関わっていると推測出来ます。そしてその次に「redirected」とあるのでここでもリダイレクト**されたということが推測出来ます。

以上の検証内容から推測すると**「リダイレクトでログイン画面に飛ばされたのかな?」**と仮定することが出来ます。

ではそのような処理をしている箇所はと言うと**「authenticate_user!」という部分が該当すると分かりました。ここで少し「authenticate_user!」**について説明します。

#authenticate_user!とは
処理が実行された時にユーザーがログインしていなければ、そのユーザーをログイン画面に遷移させます。という処理をしてくれるdevise用のメソッドです。

以上の点から自分はテストコード実行時は該当の**「authenticate_user!」**の箇所をコメントアウトすることにしました。

orders_controller.rb
class OrdersController < ApplicationController
  before_action :authenticate_user! (この行をコメントアウトする)

#再度単体テストコードを実行

ターミナル
% bundle exec rspec spec/requests/orders_spec.rb

OrdersController
  GET /index
    indexアクションにリクエストすると正常にレスポンスが返ってくる
    indexアクションにリクエストするとレスポンスに出品済みの商品の説明文が存在する
    indexアクションにリクエストするとレスポンスに出品済みの商品の画像が存在する
    indexアクションにリクエストするとレスポンスに出品済みの商品の販売価格が存在する
    indexアクションにリクエストするとレスポンスに購入内容の確認の文言が存在する

Finished in 5.79 seconds (files took 10.02 seconds to load)
5 examples, 0 failures

上記の通り無事にテストコードを実行することが出来ました。

#おわりに

今回のエラー(302)はコントローラーのテストコード実行時に「authenticate_user!」でログイン画面にリダイレクトされていたために起きたエラーでした。結合テストコードだとログインする処理は簡単なのですがコントローラーの単体テストコードの際にログイン出来るのか少し調べた限りではよくわかりませんでしたので今回はコメントアウトをすることで対処しました。

#当記事内で参考にさせて頂いたサイト

HTTP レスポンスステータスコードについての参考サイト

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?