#はじめに
前回の記事の続きってわけでも無いのですが、似たような内容にはなっています。
それと「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!」**の箇所をコメントアウトすることにしました。
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!」でログイン画面にリダイレクトされていたために起きたエラーでした。結合テストコードだとログインする処理は簡単なのですがコントローラーの単体テストコードの際にログイン出来るのか少し調べた限りではよくわかりませんでしたので今回はコメントアウトをすることで対処しました。
#当記事内で参考にさせて頂いたサイト