はじめに
今回はコントローラーの単体テストコード実装時に出た表題のエラーの件について記述したいと思います。ですがその前にまずはBasic認証について軽く説明したいと思います。
Basic認証とは
Webサイトにアクセス制限をかける方法の一つ。その中でも最も簡易的に制限をかけることができる方法がベーシック認証(Basic認証)です。ベーシック認証(Basic認証)はWebサーバーに付随している機能の1つでファイルに数行の記述をするだけで簡単にアクセス制限をかけることが可能です。
「引用させて頂いたサイト」
ベーシック認証(Basic認証)とは?設定方法と注意点・エラーになる原因を解説
エラー内容
それでは改めまして今回の本題について説明させて頂きます。
まず初めにコントローラーの単体テストコード実行時に下記のエラーが出ました。
bundle exec rspec spec/requests/items_spec.rb
~中略~
Failures:
1) ItemsController GET /index indexアクションにリクエストすると正常にレスポンスが返ってくる
Failure/Error: expect(response.status).to eq 200
expected: 200
got: 401
(compared using ==)
# ./spec/requests/items_spec.rb:28:in `block (3 levels) in <top (required)>'
2) ItemsController GET /index indexアクションにリクエストするとレスポンスに出品済みの商品名が存在する
Failure/Error: expect(response.body).to include @item.goods
expected "HTTP Basic: Access denied.\n" to include "Custard Apples Daikon"
Diff:
@@ -1 +1 @@
-Custard Apples Daikon
+HTTP Basic: Access denied.
~中略~
エラー内容の検証
上記の内容から今回のエラーの原因の該当箇所と思われる部分は下記の2点です。
1)
expected: 200
got: 401
2)
expected "HTTP Basic: Access denied.\n" to include
まず1つ目はexpectedで「200」(成功)を期待していますが実際のレスポンスは「401」(未認証)でしたという内容です。
そして2つ目の方でBasicという単語が出てるので設定していたBasic認証ではじかれているのだろうと仮定しました。
(まあ英語の内容(HTTP Basic: Access denied)もシンプルにHTTPのBasicでアクセスが拒絶されました。みたいな意味合いなので)
上記の2つのエラー内容から「application_controller.rb」内に設定していたBasic認証の部分を通れていないせいでテストコードが失敗したと判断しました。
そこで自分はテストコードの実行時だけは該当のBasic認証の部分をコメントアウトすることにしました。
class ApplicationController < ActionController::Base
before_action :basic_auth (この行をコメントアウトする)
そして再度単体テストコードを実行
bundle exec rspec spec/requests/items_spec.rb
ItemsController
GET /index
indexアクションにリクエストすると正常にレスポンスが返ってくる
indexアクションにリクエストするとレスポンスに出品済みの商品名が存在する
indexアクションにリクエストするとレスポンスに出品済みの商品の画像が存在する
indexアクションにリクエストするとレスポンスに出品済みの商品の販売価格が存在する
indexアクションにリクエストするとレスポンスに新規投稿商品一覧が存在する
Finished in 3.21 seconds (files took 4.76 seconds to load)
5 examples, 0 failures
上記の通り無事にテストコードを実行することが出来ました。
おわりに
調べているとBasic認証の部分を残したままでもテストコードを行う方法があるみたいだったのですが少し複雑そうだったため今回は簡単なこちらの方法にしてみました。