테스트 코드로 "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.rbclass 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
지적해 주셔서 아래 수정했습니다.
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)>'
~中略~
root_path에 액세스 할 때 HTTP 상태가 401로되어 있습니다 (액세스 할 수 없습니다)라는 오류 패턴.
본 어플리케이션은 기본 인증을 도입하고 있어 그것이 관련되어 있는 것으로 예상했습니다.
기본 인증이란?
HTTP 통신의 규격에 비치되어 있는 유저 인증의 구조로, 웹 사이트에 액세스 제한을 걸 수 있는 간이적인 방법의 하나입니다.
서버와의 통신이 가능한 사용자와 비밀번호를 미리 설정해 두어, 그에 일치한 유저만이, 웹 어플리케이션을 이용할 수 있도록(듯이) 합니다.
【샘플 화상】
위의 에러문과 기본 인증으로 조사한 곳, 역시 테스트 시 기본 인증이 통과하지 못한 사례를 볼 수 있었습니다.
참고 기사(기사말에 게재)를 바탕으로, 테스트시의 리퀘스트에 basic 인증의 유저명과 패스워드를 어떻게든 건네줄 수 있을까라고 시험해 보았습니다.
결과
멘토 씨를 섞어 격투하는 약 2시간…
참고 기사를 바탕으로 다양한 방법을 시도해도 오류는 해결되지 않고.
그리고 멘토 씨가 조사한 곳 ...
"2020년 현재 테스트 시 기본 인증은 권장되지 않음"이었습니다.
무슨 일이야…
~ 할 수 없다면하지 마세요 ~
오류 해결 정책을 "테스트시 기본 인증을 통과"에서,
「프로덕션 환경 이외(테스트시)는 basic 인증을 하지 않는다」로 변경.
application_controller.rbclass 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
지적해 주셔서 아래 수정했습니다.
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
아직 초학자일 수도 있고, 에러에 직면하면 문제점을 정면에서 해결하려고 하기 쉽습니다.
이번과 같이, 에러를 피하는, 「하지 않고 끝난다」방법이 없을까 다방면으로부터 생각하는 것도 중요하다고 실감했습니다.
이 기사가 첫 게시물이었습니다. 조금이라도 참고가 되면 기쁘게 생각합니다.
끝까지 열람해 주셔서 감사합니다.
참고 기사
기본 인증(Basic 인증)이란? 설정 방법과 주의점·에러가 되는 원인을 해설
Rails×Basic인증×Rspec으로 손잡이
RSpec3에서 BASIC 인증을 받은 액션 테스트
Rails/Rspec 테스트를 http 기본 인증으로 전달
기본 인증을 갖춘 테스트 코드 작성 방법
수정 내역
2020/10/25
지적해 주셔서 아래 수정했습니다.
@ j 치토 님, 고마워요.
Reference
이 문제에 관하여(테스트 코드로 "basic 인증이 통과하지 못한 오류"를 대응 "할 수 없었던 이야기"), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/pli8xxx_yu/items/09b885db0f4a52acd446텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)