2017-09-28 5 views
2

私はこのようなものがあります。これはので、私はそれがで使われている、ルートディレクトリを設定することができますですテスト中、urlconfで使用されているDjango設定を上書きする方法は?私のDjangoプロジェクトのURLconfので

MY_ROOT_DIR = 'phil' 

:私のsettings.py

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

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

を私のようなものがあるでしょういくつかの場所、1つの場所(設定)。

私は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値は常に"phil"あり、"terry"のは決して上書きされた設定。私も@modify_settingsを試して、クラスではなくテストメソッドで使用しました。

@override_settingsが有効になる前に、urlconfがDjangoによって読み込まれていると思いますか?これを回避する方法はありますか?それとももっと良い解決策ですか?

答えて

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分待たなければならなかった! –

関連する問題