요청 사양 현실적인 오류 응답

11775 단어 rubytestingrails

행복한 요청 사양



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_exceptionsshow_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 GeeEliot Sykes 의 기여 없이는 이 게시물이 존재하지 않는다는 점을 충분히 강조할 수 없습니다. 이 솔루션을 공유해 주셔서 감사합니다. 저는 지난 몇 년 동안 다양한 코드베이스에서 이 접근 방식을 사용했습니다. 저는 이 접근 방식을 많은 사람들과 공유했습니다(이제 여러분과도 공유). 이 게시물은 그들의 작업에 대한 관심을 끄는 역할을 합니다.

좋은 웹페이지 즐겨찾기