AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

Django 테스트에서 @override_settings가 실패하는 이유와 해결 방법

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

Django 테스트 개발자, 글로벌 상태와 설정 오버라이드를 다루는 개발자

핵심 요약

  • @override_settings는 모듈 로딩 시점에 초기화된 글로벌 상태는 변경하지 못한다
  • importlib.reload()를 통해 모듈을 강제로 재로딩하고 patch()로 글로벌 변수를 교체
  • 모듈 범위에 복잡한 로직은 피하고 함수/지연 로딩으로 대체

섹션별 세부 요약

1. 문제 상황

  • dragon.py 모듈에서 settings.PUT_EGGS 값에 따라 글로벌 딕셔너리 DRAGON을 초기화
  • mario.pyDRAGON을 사용하여 핵심 로직 구현
  • @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.pyDRAGON을 교체
  • 테스트 범위 내에서만 새로운 DRAGON 적용

4. 추가 고려사항

  • 글로벌 상태는 모듈 범위에 넣지 않도록 권장
  • reload()patch() 사용 시 의존성 체인 주의

결론

  • 글로벌 상태 초기화는 함수/지연 로더로 대체
  • reload() + patch() 조합으로 설정 오버라이드 문제 해결
  • 테스트 실패 시 모듈 로딩 시점 초기화 여부를 반드시 확인