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

#はじめに

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

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


```zsh:ターミナル

 % 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)>'

〜中略〜

```

#エラー内容の検証
それではエラー内容を検証していきたいと思います。
今回のエラーの原因となる該当箇所は<font color="red">２つ</font>あります。
まず<font color="red">１つ目</font>は下記の部分です。

```zsh:ターミナル

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

次に<font color="red">２つ目</font>は下記の部分です。


```zsh:ターミナル
  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 "商品の説明"
```

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

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

#302 (Found) エラーとは

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

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

**（引用させて頂いた参考サイト）**
[HTTP レスポンスステータスコードについての参考サイト](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)

---

- それでは次に<font color="red">２つ目のエラー</font>ですが自分が着目したポイントは下記の部分です。

```zsh

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

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

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

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

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

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

```ruby:orders_controller.rb
class OrdersController < ApplicationController
  before_action :authenticate_user! （この行をコメントアウトする）
```

---


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

```zsh:ターミナル
% 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
```

<font color="red">上記の通り無事にテストコードを実行することが出来ました。</font>


#おわりに

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


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

[HTTP レスポンスステータスコードについての参考サイト](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)