요청 사양에 대한 익명 컨트롤러 테스트

2639 단어 railsrspec
요청 사양을 통해 테스트 도구 모음을 개발할 때 작업이 없는 컨트롤러의 기능을 테스트할 수 있습니다. 이러한 컨트롤러는 여러 컨트롤러 간에 공통 기능을 공유하기 위해 존재합니다.
controller testing is more straight forward 을 통해 이러한 테스트를 작성하는 동안 request 테스트를 사용할 때 이와 같은 직접적인 문서를 찾을 수 없었습니다.

그럼 시작하겠습니다. 다음과 같은 BaseController.rb라는 컨트롤러가 있다고 가정해 보겠습니다.

class BaseController < ActionController::API
   private 
   def current_company
     return "forem" if request.headers['X-Api-Token'].present?
     return "external"
   end
end


기사를 위해 우리는 url인 경우 현재 회사를 Forem으로 반환하는 간단한 방법을 만들었습니다. 문자열 'forem'을 포함하거나 단순히 "external"을 반환합니다.

이것을 테스트해 보겠습니다. rspec 파일인 base_controller_spec.rb에서 다음 코드를 사용합니다.

describe 'Sets company', type: :request do
  before do
    klass = Class.new(BaseController) do
      def index
         json_response(current_company, :ok))
      end
    end
    stub_const('TestController', klass)

    Rails.application.routes.disable_clear_and_finalize = true 

    Rails.application.routes.draw do
      get '/test', to: 'test#index'
    end
  end

  after { Rails.application.reload_routes! }

end


우리가 한 일은 다음과 같습니다.
  • 이전 블록에서 새 익명 클래스를 정의합니다. Animus 클래스는 상수가 할당되지 않은 표준 루비 클래스입니다. 유지 관리 가능한 테스트를 작성하는 데 매우 유용합니다.
  • Class.new(BaseController)는 루비에서 상속의 한 형태입니다.
  • 이 익명 클래스 내에서 간단한 json 응답을 반환하는 새 메서드/액션을 정의합니다. 이 응답을 통해 기본 컨트롤러 메서드가 예상대로 작동하는지 테스트할 수 있습니다.
  • 이 클래스가 다른 사양 파일로 유출되는 것을 방지하는 데 도움이 되는 stub_constant를 사용합니다.
  • Rails.application.routes.disable_clear_and_finalize = true를 통해 모든 원래 경로를 보존합니다.
  • 그런 다음 테스트를 수행할 새 경로 끝점을 만듭니다. 이 경로는 익명 클래스 내부에 정의된 새로 생성된 컨트롤러 작업을 가리킵니다
  • .
  • 모든 테스트가 실행되면 라우팅 테이블을 원래 상태로 되돌립니다.

  • 테스트를 시작하겠습니다. 자명해야 합니다.

    it 'when api token is given' do
      get '/test', headers: {'X-Api-Token': 'random_test'}
      expect(response.body).to eq("forem")
    end
    
    it 'when api token is not given' do
      get '/test', headers: {} 
      expect(response.body).to eq("external")
    end
    


    이 간단한 사원은 베이스 컨트롤러를 테스트하기 위한 보다 복잡한 문제를 해결하기를 바랍니다. 전체 토론은 다음과 같습니다found here.

    좋은 웹페이지 즐겨찾기