요청 사양 현실적인 오류 응답
행복한 요청 사양
Let’s build some happy little trees.
-- Bob Ross
RSpec을 사용할 때 "전체 스택을 통해 동작을 유도"하는 request spec을 생성할 수 있습니다.
API 엔드포인트에 대한 최고 수준의 승인 테스트로 요청 사양을 사용합니다. 우리는 사용자가 일종의 캔버스에 미리 정의된 요소를 배치할 수 있는 시스템을 구축하고 있습니다. 캔버스에 작은 나무를 배치하는 테스트를 만들어 봅시다.
it "creates a happy little tree" do
post little_trees_path,
params: { tree: { disposition: "happy", x: 200, y: 100 } }
expect(response).to have_http_status(:created)
end
트리를 찾을 수 있는지도 확인합니다.
it "shows an existing tree" do
tree = FactoryBot.create(:tree, :little)
get little_trees_path(tree)
expect(response).to have_http_status(:ok)
end
테스트 사고
We don’t make mistakes, just happy little accidents.
-- Bob Ross
우리는 또한 사용자가 행복한 사고를 할 때 시스템이 예상대로 응답하도록 하고 싶습니다. 작지 않은 트리에 대해 이 끝점을 요청하는 것은 찾을 수 없습니다.
it "does not find a large tree" do
tree = FactoryBot.create(:tree, :large)
get little_trees_path(tree)
expect(response).to have_http_status(:not_found)
end
이 테스트는 통과하지 못합니다! 우리가 이것을 TDD하고 있고 구현이 존재하지 않기 때문이 아닙니다. curl 또는 다른 방식으로 적중하면 엔드포인트가 예상대로 응답합니다.
테스트에서
ActiveRecord::RecordNotFound
예외가 발생합니다. 이 경우 Rails가 404 상태 코드를 반환해야 한다는 것을 알고 있습니다. 그러나 요청 사양은 여전히 예외를 발생시킵니다.선행 기술
Anytime you learn, you gain.
-- Bob Ross
이 문제를 스스로 해결하는 방법을 찾지 못했습니다. 나는 다른 사람의 접근 방식에 대한 해결책을 찾았습니다.
rspec-rails
의 이슈 트래커에서 this issue을 찾았습니다. 거기Michael Gee에서 해결 방법을 공유합니다. 내가 찾을 수 있는 이 접근 방식에 대한 가장 초기 참조는 2017년의 Eliot Sykes입니다. 이에 대한 이전 참조를 알고 있다면 알려주세요!현실적인 그림 그리기
All you need to paint is a few tools, a little instruction, and a vision in your mind.
-- Bob Ross
테스트에서 프로덕션 동작을 확인하려면 Rails' fancy exception page 를 꺼야 합니다. Michael과 Eliot는 이 방법을 공유합니다.
module ErrorResponses
def respond_without_detailed_exceptions
env_config = Rails.application.env_config
original_show_exceptions = env_config["action_dispatch.show_exceptions"]
original_show_detailed_exceptions = env_config["action_dispatch.show_detailed_exceptions"]
env_config["action_dispatch.show_exceptions"] = true
env_config["action_dispatch.show_detailed_exceptions"] = false
yield
ensure
env_config["action_dispatch.show_exceptions"] = original_show_exceptions
env_config["action_dispatch.show_detailed_exceptions"] = original_show_detailed_exceptions
end
end
테스트에서 이 방법을 사용합니다. 환경 구성의 초기 값을 저장한 다음 프로덕션과 일치하도록
show_exceptions
및 show_details_exceptions
를 설정합니다. 블록이 실행된 후 원래 값으로 되돌립니다.이 방법을 사용하도록 테스트를 업데이트해 보겠습니다.
it "does not find a large tree" do
respond_without_detailed_exceptions do
tree = FactoryBot.create(:tree, :large)
get little_trees_path(tree)
expect(response).to have_http_status(:not_found)
end
end
이제 테스트가 통과되었습니다! 404를 반환하고 예외를 발생시키지 않습니다.
도구 사용
You can do anything here — the only prerequisite is that it makes you happy.
-- Bob Ross
RSpec을 사용하는 경우 Eliot에서 다시 제공되는 또 다른 옵션이 있습니다. RSpec의
around
hook을 사용하여 메타데이터를 적용하여 respond_without_detailed_exceptions
에 블록으로 전체 테스트를 통과할 수 있습니다.module ErrorResponses
RSpec.configure do |config|
config.include self, type: :request
config.around(realistic_error_responses: true) do |example|
respond_without_detailed_exceptions(&example)
end
end
end
이를 통해 테스트를 다음과 같이 다시 작성할 수 있습니다.
it "does not find a large tree", :realistic_error_responses do
tree = FactoryBot.create(:tree, :large)
get little_trees_path(tree)
expect(response).to have_http_status(:not_found)
end
예술적 영감
Don’t forget to tell these special people in your life just how special they are to you.
-- Bob Ross
Michael Gee 및 Eliot Sykes 의 기여 없이는 이 게시물이 존재하지 않는다는 점을 충분히 강조할 수 없습니다. 이 솔루션을 공유해 주셔서 감사합니다. 저는 지난 몇 년 동안 다양한 코드베이스에서 이 접근 방식을 사용했습니다. 저는 이 접근 방식을 많은 사람들과 공유했습니다(이제 여러분과도 공유). 이 게시물은 그들의 작업에 대한 관심을 끄는 역할을 합니다.
Reference
이 문제에 관하여(요청 사양 현실적인 오류 응답), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kevin_j_m/request-spec-realistic-error-response-daj텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)