Feature Spec의 비동기성과 Capybara의 대기 메커니즘
Capybara Feature Spec은 테스트 러너, 서버, 브라우저 간 비동기적 상호작용으로 인해 불안정할 수 있습니다. visit root_path 같은 명령은 페이지 방문만 지시할 뿐, 로딩 완료를 보장하지 않습니다. Capybara는 이를 해결하기 위해 대기 메커니즘을 제공합니다.
-
Capybara 매처의 폴링 동작:
expect(page).to have_content("Overview")같은 매처는 비동기 컨텍스트를 고려하여 요소를 찾을 때까지 페이지를 주기적으로 폴링하며 기다립니다. 지정 시간 내에 찾지 못하면 실패합니다. -
모든 액션 후 명시적 대기:
visit,click_on등 모든 Capybara 액션 후에는 반드시 Capybara 기대(expectation)를 사용하여 요청 완료 및 페이지 상태 변경을 검증해야 합니다 (예: 특정 텍스트나data-testid속성 확인).
page.document.synchronize를 활용한 복합 액션 처리
단일 대기 매처만으로는 해결하기 어려운 복합 비동기 시나리오가 있습니다. 특히 드롭다운처럼 여러 클릭 액션이 연쇄적으로 발생하는 경우, 첫 클릭은 성공했으나 드롭다운이 완전히 열리지 않아 다음 옵션을 찾지 못하는 문제가 발생할 수 있습니다. click_on은 요소의 가시성만 기다리므로, 다음 옵션 실패 시 첫 클릭을 재시도하지 않습니다.
-
synchronize의 역할:page.document.synchronize메서드는 블록 내의 모든 액션을 성공하거나 타임아웃될 때까지 재시도합니다.ruby page.document.synchronize do click_on "Actions" click_on "View" end이 코드는click_on "View"실패 시click_on "Actions"부터 다시 시도하여 드롭다운이 열리고 “View” 옵션을 클릭할 수 있도록 보장합니다. -
주의사항:
synchronize블록 내에서는expect매처 대신page.find와 같이 오류를 발생시키는 Capybara 메서드를 사용해야 재시도 로직이 적용됩니다.
이러한 Capybara 대기 동작은 일관된 Feature Spec 작성에 필수적이며, 특히 상호 의존적인 두 요소가 관련된 복잡한 시나리오에서 page.document.synchronize는 불안정성을 제거하는 강력한 도구입니다.