WebMock의 핵심 기능은 HTTP 요청 스터빙(stubbing)과 검증(verification)입니다. WebMock은 HTTP 클라이언트 라이브러리에 독립적인(agnostic) 깔끔한 DSL(Domain Specific Language)을 제공하여 테스트 코드를 명확하고 간결하게 작성할 수 있게 합니다. 이는 ‘Stub, Execute, Verify’ 패러다임을 따르며, 요청 타임아웃, 기본 인증, 원시 응답 기록 등 다양한 스터빙 시나리오를 지원합니다.
HTTP 요청 모킹의 주요 이점은 다음과 같습니다. 첫째, 인터넷 연결 없이도 격리된 환경에서 테스트를 실행할 수 있어 이동 중 작업이 가능합니다. 둘째, 잘못된 설정으로 인한 서드파티 API의 의도치 않은 변경을 방지하여 프로덕션 데이터의 손상을 막습니다. 셋째, 네트워크 불안정이나 API 다운과 무관하게 테스트를 안정적이고 빠르게 실행할 수 있으며, 타임아웃이나 500/400 응답과 같은 모든 엣지 케이스 시나리오를 Ruby 코드 내에서 쉽게 테스트할 수 있습니다. 테스트 환경 외에도 WebMock은 인터넷 연결이 없는 개발, 다양한 시나리오에 대한 수동 테스트, 외부 API 접근이 불가능한 초기 개발 단계 등 다양한 상황에서 유용하게 활용될 수 있습니다.
WebMock이 특별한 이유는 복잡한 기존 HTTP 설정을 간결한 WebMock DSL로 대체하여 테스트 코드의 가독성을 크게 향상시키기 때문입니다. 이는 TDD(Test-Driven Development)에 이상적이며, HTTP 클라이언트 선택에 대한 고민 없이 기능 구현에 집중할 수 있게 합니다. 또한, 레거시 애플리케이션에서도 예상치 못한 서드파티 API 호출을 방지하여 개발 안전성을 높여줍니다. WebMock은 스터브 선언이 잘못되었을 경우 친절한 오류 메시지와 함께 올바른 스터빙 지침을 제공하여 개발 생산성을 높입니다.
WebMock의 내부 동작 원리는 ‘마법’이 아닌 ‘무차별적인 몽키 패치(brute monkey patching)’를 통해 이루어집니다. WebMock은 HTTP 클라이언트의 핵심 요청 처리 메서드(예: handle_request
)를 포함하는 클래스의 복사본을 생성한 후, 이 복사본을 몽키 패치합니다. 요청이 발생하면, WebMock은 요청 시그니처를 생성하고 이를 등록된 스터브 패턴과 비교합니다. 일치하는 스터브가 있으면 가짜 응답을 반환하고, 없으면 실제 요청 허용 여부를 확인하여 처리하거나 예외를 발생시킵니다. 마지막으로, 원본 클래스를 몽키 패치된 복사본으로 교체하는 상수 교체(constant replacement) 방식을 사용하며, WebMock.disable
을 통해 언제든지 원래 상태로 되돌릴 수 있습니다.