테스트 코드로 "basic 인증이 통과하지 못한 오류"를 대응 "할 수 없었던 이야기"

오류시 상황



모 프리마 사이트의 복사 앱을 구현했기 때문에 연습으로 컨트롤러의 단위 테스트 코드를 기술하고 있었는데, 런타임시 터미널에서 다음 오류가 발생했습니다.

터미널
bundle exec rspec spec/requests/items_spec.rb

~中略~

 1) ItemsController GET #index indexアクションにリクエストすると正常にレスポンスが返ってくる
     Failure/Error: expect(response.status).to eq 200

       expected: 200
            got: 401

       (compared using ==)
     # ./spec/requests/items_spec.rb:20:in `block (3 levels) in <top (required)>'

~中略~

개발 환경

Ruby 2.6.5
Rails 6.0.3.3
MySQL
Visual Studio Code
(Caprybara, Rspec, Google Chrome)

고찰·검증



root_path에 액세스 할 때 HTTP 상태가 401로되어 있습니다 (액세스 할 수 없습니다)라는 오류 패턴.
본 어플리케이션은 기본 인증을 도입하고 있어 그것이 관련되어 있는 것으로 예상했습니다.

기본 인증이란?

HTTP 통신의 규격에 비치되어 있는 유저 인증의 구조로, 웹 사이트에 액세스 제한을 걸 수 있는 간이적인 방법의 하나입니다.
서버와의 통신이 가능한 사용자와 비밀번호를 미리 설정해 두어, 그에 일치한 유저만이, 웹 어플리케이션을 이용할 수 있도록(듯이) 합니다.

【샘플 화상】

위의 에러문과 기본 인증으로 조사한 곳, 역시 테스트 시 기본 인증이 통과하지 못한 사례를 볼 수 있었습니다.
참고 기사(기사말에 게재)를 바탕으로, 테스트시의 리퀘스트에 basic 인증의 유저명과 패스워드를 어떻게든 건네줄 수 있을까라고 시험해 보았습니다.

결과



멘토 씨를 섞어 격투하는 약 2시간…
참고 기사를 바탕으로 다양한 방법을 시도해도 오류는 해결되지 않고.
그리고 멘토 씨가 조사한 곳 ...
"2020년 현재 테스트 시 기본 인증은 권장되지 않음"이었습니다.

무슨 일이야…

~ 할 수 없다면하지 마세요 ~

오류 해결 정책을 "테스트시 기본 인증을 통과"에서,
「프로덕션 환경 이외(테스트시)는 basic 인증을 하지 않는다」로 변경.

application_controller.rb
class ApplicationController < ActionController::Base
  before_action :basic_auth if Rails.env.production? # テスト時はbasic認証を行わないように分岐

  private
  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == 'username' && password == 'password'
    end
  end
end

※username과 password는, 실제로는 환경 변수로 설정하고 있습니다.

before_action에 if Rails.env.production?을 추가하여 프로덕션 환경에서만 적용합니다.
덕분에 테스트시 기본 인증하지 않고 그대로 톱 페이지에 액세스하여 테스트를 실행할 수 있습니다!

감상



아직 초학자일 수도 있고, 에러에 직면하면 문제점을 정면에서 해결하려고 하기 쉽습니다.
이번과 같이, 에러를 피하는, 「하지 않고 끝난다」방법이 없을까 다방면으로부터 생각하는 것도 중요하다고 실감했습니다.

이 기사가 첫 게시물이었습니다. 조금이라도 참고가 되면 기쁘게 생각합니다.
끝까지 열람해 주셔서 감사합니다.

참고 기사

기본 인증(Basic 인증)이란? 설정 방법과 주의점·에러가 되는 원인을 해설
Rails×Basic인증×Rspec으로 손잡이
RSpec3에서 BASIC 인증을 받은 액션 테스트
Rails/Rspec 테스트를 http 기본 인증으로 전달
기본 인증을 갖춘 테스트 코드 작성 방법

수정 내역

2020/10/25
지적해 주셔서 아래 수정했습니다.
  • 비추천에 대해서는 구두만으로 묻는 이야기로 소스원이 불확실하기 때문에, 상쇄선을 넣었습니다. ( "그런 소문이있는"정도로 잡아 주시면 좋겠습니다.)
  • 요점은, 에러를 대응할 수 없었던 이야기이므로, 타이틀을 변경했습니다.

  • @ j 치토 님, 고마워요.

    좋은 웹페이지 즐겨찾기