Rspec에서 로그인 메서드를 공통화하여 잘라내기(devise 사용하지 않을 때)[system spec][request spec]

11134 단어 RSpecRails

소개



로그인 기능을 공부하기 위해 로그인 기능을 devise를 사용하지 않고 자작했는데, 테스트에서 매우 고생했기 때문에 배운 것을 아래에 적습니다.

이번에는 system spec과 request spec에서 테스트를 기재하고 많은 곳에서 사용하게 하기 위해 이러한 처리를 별도의 파일에 내보냈습니다.

실행 환경은 다음과 같습니다.
  • Rails 5.2.4.2
  • Rspec 4.0.1
  • capybara 3.33.0

  • 로그인 화면 정보



    이메일과 비밀번호로 로그인할 수 있는 양식을 만들고 있습니다. 이미지는 참고 이미지입니다.


    기본 로그인 방법



    로그인 메소드를 system spec과 request spec으로 각각 나타내면 아래와 같이 됩니다. 이번에는 한 상점에 ​​속한 직원을 만들고 직원의 이메일 주소와 비밀번호로 로그인합니다.

    시스템 사양



    spec\system\shops_spec.rb
    let!(:shop) { FactoryBot.create(:shop) }
    let!(:user) { FactoryBot.create(:staff, shop_id: shop.id ) }
    
    before do
      visit login_path
      fill_in "E-mail", with: user.email
      fill_in "Password", with: user.password
      click_button 'LOGIN'
    end
    

    request spec



    spec\system\shops_spec.rb
    let!(:shop) { FactoryBot.create(:shop) }
    let!(:user) { FactoryBot.create(:staff, shop_id: shop.id ) }
    
    before do
      session_params = { session: { email: user.email, password: user.password } }
      post "/login", params: session_params
    end
    

    공통 사항 요약(1) shared_context



    우선, let로 직원을 정의하고 있는 2행이, 양자로 중복하고 있었으므로, 그것을 shared_context (을)를 이용해, 다른 파일에 써냅니다.

    spec\support\contexts\user_setup.rb
    RSpec.shared_context "user_setup" do
      let!(:shop) { FactoryBot.create(:shop) }
      let!(:user) { FactoryBot.create(:staff, shop_id: shop.id ) }
    end
    

    이 때, spec\rails_helper.rb 안에 있는, 이하의 행의 코멘트 아웃을 제외해, spec\support 내의 파일이나 디렉토리를 모두 읽어들일 수 있도록 해 둡니다.

    spec\rails_helper.rb
    Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }
    

    이 설정에서 spec 내에서는 다음과 같이 작성하여 사용자를 설정할 수 있습니다.
    # 任意のspecファイル内
    include_context "user_setup"
    

    공통 사항 요약 (2) module



    system spec과 request spec의 공통 처리도 각각 모듈에 정리하는 것으로, 여러가지 곳에서 사용 돌릴 수가 있습니다. 이번에 작성한 파일은 다음과 같습니다.

    시스템 사양



    spec\support\sign_in_module.rb
    module SignInModule
      def sign_in_as(user)
        visit login_path
        fill_in "E-mail", with: user.email
        fill_in "Password", with: user.password
        click_button 'LOGIN'
      end
    end
    

    덧붙여 이때, 파일명과 모듈명은 일치시킬 필요가 있는 것 같습니다. 예를 들어, SignInModule 라면, sign_in_module.rb 라고 하는 파일명으로 할 필요가 있습니다.

    ▼참고 사이트
    htps : // / ぃシャッ p. 이 m / rs pe c / rs pe c - 이것 / v / 3 - 0 / 두 cs / help-ro ds /ぇ

    request spec



    spec\support\login_request_module.rb
    module SignInRequestModule
      def sign_in_request_as(user)
        session_params = { session: { email: user.email, password: user.password } }
        post "/login", params: session_params
      end
    end
    

    rails_helper.rb에 대한 설명



    이 때 spec\rails_helper.rb 에는 다음과 같이 기입합니다. (명시적으로 로드하는 것을 기재하지 않으면, 읽을 수 없었습니다….)

    spec\rails_helper.rb
    RSpec.configure do |config|
      # 中略
      config.include SignInModule
      config.include SignInRequestModule
    
    end
    

    이 근처 좀 더 DRY에 걸릴 것 같아서, 방법을 알면 추기하고 싶습니다.

    spec 파일에서의 사용법



    위와 같이 설명하면 spec 파일에서 이 방법으로 각각 로그인 메서드를 호출할 수 있습니다.
    # 任意のsystem specファイル
    include_context "user_setup"
    before do
      sign_in_as(user)
    end
    
    # 任意のrequest specファイル
    include_context "user_setup"
    before do
      sign_in_request_as(user)
    end
    

    정리 & 참고 사이트



    devise 사용하지 않고 로그인 기능을 구현해 준다! 라고 노력해 만들기 시작했습니다만, devise는 여러가지 곳에서 수고를 간략화해 주는 것을 알았습니다. 앞으로는 devise와 잘 사귀고 싶습니다.
    한편, 로그인의 구조에도 자세하게 되었으므로, 엔지니어로서의 스킬 업은 할 수 있었다고 생각합니다.

    이번 참고로 한 정보는 이쪽.
    Define helper methods in a module
    Request Spec을 사용합시다.
    What is the proper way to sign in as a user in an rspec request spec, without devise?
    rails5 can't access session in ActionDispatch::IntegrationTest

    좋은 웹페이지 즐겨찾기