피드로 돌아가기
Dev.toBackend
원문 읽기
Python Mocking 실패를 막는 'Patch Where It Is Used' 원칙
Python Mock Pitfall: Patch Where It Is Used, Not Where It Is Defined
AI 요약
Context
Python의 from module import name 방식은 함수 객체의 참조를 가져와 로컬 네임스페이스에 새로운 바인딩을 생성함. 정의된 모듈의 함수를 Patch 하더라도 이미 참조를 복사한 호출 모듈의 바인딩은 변경되지 않아 Mock이 적용되지 않는 문제 발생.
Technical Solution
- 호출 모듈의 Namespace 내에 존재하는 참조를 직접 교체하는
patch('target_module.name')전략 채택 from X import Y구문 사용 시 X.Y가 아닌 호출측 모듈의 Y를 타겟팅하여 런타임 참조 일치 유도import X구문 사용 시에는 매 호출마다 모듈 룩업을 수행하므로patch('X.Y')로 해결 가능한 구조적 차이 활용- 정의 위치(Definition)와 사용 위치(Usage)를 분리하여 Namespace 바인딩 메커니즘에 기반한 Mocking 경로 설정
- 동일 모듈 내 함수 호출 시에도 해당 모듈의 네임스페이스를 Patch 하여 일관된 참조 교체 수행
실천 포인트
1. Mock 적용 실패 시 import 구문이 `from X import Y` 형태인지 확인
2. 정의된 위치가 아닌 함수가 실제 호출되는 모듈의 경로로 Patch 타겟 수정
3. 동적 룩업이 필요한 경우 `import X` 후 `X.Y()` 형태로 호출하는 구조 검토