Rspec에서 로그인 메서드를 공통화하여 잘라내기(devise 사용하지 않을 때)[system spec][request spec]
소개
로그인 기능을 공부하기 위해 로그인 기능을 devise를 사용하지 않고 자작했는데, 테스트에서 매우 고생했기 때문에 배운 것을 아래에 적습니다.
이번에는 system spec과 request spec에서 테스트를 기재하고 많은 곳에서 사용하게 하기 위해 이러한 처리를 별도의 파일에 내보냈습니다.
실행 환경은 다음과 같습니다.
로그인 화면 정보
이메일과 비밀번호로 로그인할 수 있는 양식을 만들고 있습니다. 이미지는 참고 이미지입니다.
기본 로그인 방법
로그인 메소드를 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
Reference
이 문제에 관하여(Rspec에서 로그인 메서드를 공통화하여 잘라내기(devise 사용하지 않을 때)[system spec][request spec]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tanutanu/items/14b0a1729069b53aa5b8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)