Django 테스트에서 @override_settings가 실패하는 이유와 해결 방법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
Django 테스트 개발자, 글로벌 상태와 설정 오버라이드를 다루는 개발자
핵심 요약
@override_settings
는 모듈 로딩 시점에 초기화된 글로벌 상태는 변경하지 못한다importlib.reload()
를 통해 모듈을 강제로 재로딩하고patch()
로 글로벌 변수를 교체- 모듈 범위에 복잡한 로직은 피하고 함수/지연 로딩으로 대체
섹션별 세부 요약
1. 문제 상황
dragon.py
모듈에서settings.PUT_EGGS
값에 따라 글로벌 딕셔너리DRAGON
을 초기화mario.py
는DRAGON
을 사용하여 핵심 로직 구현@override_settings(PUT_EGGS=True)
로 테스트 시DRAGON
이 초기화되지 않음
2. 실패 원인
@override_settings
는 런타임에 설정을 읽는 코드만 영향DRAGON
은 모듈 로딩 시점에 이미 초기화되어 오버라이드 적용 불가
3. 해결 방법
importlib.reload(dragon)
으로dragon.py
모듈을 재로딩하여 새로운DRAGON
생성patch('myproject.mario.DRAGON', new_dragon.DRAGON)
으로mario.py
의DRAGON
을 교체- 테스트 범위 내에서만 새로운
DRAGON
적용
4. 추가 고려사항
- 글로벌 상태는 모듈 범위에 넣지 않도록 권장
reload()
와patch()
사용 시 의존성 체인 주의
결론
- 글로벌 상태 초기화는 함수/지연 로더로 대체
reload()
+patch()
조합으로 설정 오버라이드 문제 해결- 테스트 실패 시 모듈 로딩 시점 초기화 여부를 반드시 확인