2012-05-01 11 views
0

初期化時にカスタム権限を作成するアプリケーションをテストしようとしています。これらは、右のデータベースの作成後に作成されています。私は、設定をオーバーライドするために見つけることができますプロジェクトに依存しない設定をテスト用に完全に使用する

custom_permissions = getattr(settings,'SOMEAPP_PERMISSIONS',()) 

def create_custom_permissions(sender, **kwargs): 
    ct, created = ContentType.objects.get_or_create(model = '', 
                app_label = 'some_app', 
                defaults = {'name':'some_app'}) 

    for codename, name in custom_permissions: 
     perm = Permission.objects.get_or_create(codename = codename, 
             content_type__pk = ct.id, 
             name = name) 

post_save.connect(create_custom_permissions, Permission) 

すべての議論がややようにoverride_settingswith self.settingsとに関連しています。私はテストケースの間に設定を上書きする場合でも、私の機能は、既に実行されており、設定の変更は、もちろん、何の効果もありません:

@override_settings(SOMEAPP_PERMISSIONS = (('some_custom_permission','No Name')) 
class TestCustomPermissions(TestCase): 

    fixtures = ['some_app_user_fixture.json'] 
    urls = 'some_app.tests.test_urls' 

    def test_create_point_privileges(self): 
     """ check if all necessary privileges have been created """ 
     Permission.objects.get(codename = 'some_custom_permission') 

を、したがって、すべての私のテストが失敗します。さて、この特別な機能をテストするためだけに設定ファイルを使用するにはどうしたらいいですか?それはデータベースの作成と結びついていますか?あなたが今しなければならないだろうすべてが提供され

# project/settings.py 
SOMEAPP_PERMISSIONS = (
    'foo', 'bar' 
) 

# project/test.py 
from project.settings import * 

SOMEAPP_PERMISSIONS = (
    'bar', 'baz' 
) 

:あなたは1つのDjangoプロジェクトから別のものに表示されます

答えて

1

何かがあなたが個別の設定モジュールは消耗品のテスト構成/上書きすることを提供する必要がありますということですあなたは管理コマンドを実行するときに設定オプション:python ./manage.py test --settings=project.test。それは簡単で、効果的で、自己文書化しています。

+0

非常に便利ですが、強制的にこれらの設定をプログラムで使用することはできませんか?私はそれを好むだろう。 – marue

+0

'signals.post_sync'を聞いて' signals.post_syncdb'ではないので、テストの前に 'Permission'オブジェクトを保存するだけで済みます。 'SOMEAPP_PERMISSIONS + =( 'bar'、 'baz')'はあなたにとって完璧であり、テストランナーが結果を収集している間にプロジェクト構成を動的に構成しないようにする方法は常にあります。 'signals.post_syncdb'を聞いていたなら、' setup() '/' teardown() 'の両方で設定オーバーライド/ロールバックを使って' management.call_command( 'syncdb') 'あなたがチームのファンを失うことは確かです! –

+0

いいえ、 'custom_permissions = getattr(settings、 'SOMEAPP_PERMISSIONS'、())'という行は関数の外にあり、モジュールがロードされると一度初期化されます。その間に設定をオーバーライドした場合でも、 '()'を返します。これはかなり難しいようです... – marue

関連する問題