2017-09-28 13 views
2

나는 이런 식으로 뭔가가 있습니다에서테스트 중에 urlconf에서 사용되는 장고 설정을 무시하는 방법은 무엇입니까? 내 장고 프로젝트의 urlconf에서

from django.conf import settings 
from django.conf.urls import include, url 

urlpatterns = [ 
    url(r'^{}/blog'.format(settings.MY_ROOT_DIR), 
     include('weblogs.urls')), 
    # ... 
] 

을 내 settings.py 내가 좋아하는 뭔가를해야합니다 : 이것은 그래서 그가에 사용되는 루트 디렉토리를 설정할 수 있습니다

MY_ROOT_DIR = 'phil' 

을 한 장소 (설정)에서 여러 장소.

내가 URL을 테스트하기 위해 올

, 내가 @override_settings decorator 사용하지만

from django.test import TestCase, override_settings 
from django.urls import reverse 

@override_settings(MY_ROOT_DIR='terry') 
class WeblogUrlsTestCase(TestCase): 

     def test_post_detail_url(self): 
      self.assertEqual(
       reverse('post_detail', kwargs={'slug': 'my-post'}), 
       '/terry/blog/my-post/' 
      ) 

, @override_settings는 아무것도 표시되지 않습니다 - urls.py에 사용 된 MY_ROOT_DIR 값이 항상 "terry"의 오버라이드 (override) 설정 "phil" 결코 . 나는 또한 @modify_settings을 시험해보고 클래스가 아닌 테스트 메소드에서 사용했다.

@override_settings가 적용되기 전에 urlconf가 장고에 의해로드 된 것 같습니까? 이 문제를 해결할 방법이 있습니까? 아니면 더 나은 해결책일까요?

답변

2

짐작할 수 있듯이 URL에 이미 가져온 설정을 재정의했습니다. 어떤 방법에서 settings 변수를 사용하고 전역 범위가 urls.py이 아닌 경우이 방법이 유용했을 것입니다.

런타임시 설정 구성을 재정의하는 것이 편리하다고 생각되지만 필자는 테스트를 위해 별도의 파일을 만들어야합니다. 이렇게하면 테스트를위한 많은 구성을 절약 할 수 있습니다. 이렇게하면 완료 데이터베이스 정리와 같은 돌이킬 수없는 작업을 수행하지 않게됩니다.

# test_settings.py 

MY_ROOT_DIR = 'terry' 

은 manage.py에

settings = 'my_project.test_settings' if 'test' in sys.argv else 'my_project.settings' 

를 추가하여 테스트 파일 'my_project/test_settings.py'에 존재하는 말. 이렇게하면 python manage.py test을 실행할 때 test_settings 만 사용합니다. pytest와 같은 다른 테스트 클라이언트를 사용하는 경우 pytest.ini에 쉽게 추가 할 수 있습니다.

+0

아 물론. 나는 이미 테스트 용으로 별도의 설정 파일을 가지고 있지만, 어떤 이유로이 파일을 사용하지 않을 것입니다! 오늘 두뇌가 피곤합니다 :) 감사합니다! –

+0

@ PhilGyford 도움이된다면 정답으로 표시해주세요 :) – hspandher

+0

나에게 5 분을 기다려야 만! –