8

最終的にアプリのテストをいくつか行うことにしましたが、ユーザーが別のユーザーを変更できるかどうかのテストに行き詰まっています (ユーザーのタイプによって異なります-django-rules を使用して、論理的なアクセス許可チェックを行うことができます。しかし、これは重要ではありません)

ここに私がこれまでに持っているコードがあります

class RulesAndPermissionsTests(TestCase):
    fixtures = ['auth_no_permissions.json', 'profiles.json', 'rules.json']

    def setUp(self):
        self.c = Client()
        self.user = User.objects.get(username="estagiario")
        self.non_staff = User.objects.get(username="fisica")
        self.admin = User.objects.get(username="admin")
        login = self.c.login(username='estagiario', password='estagiario')

    def test_can_change_non_staff_users(self):
        self.assertFalse(self.user.has_perm('logical_change_user', self.non_staff.profile)) # can't change non staff users without permission

        # now add the permission and test it again
        self.user.user_permissions.add(Permission.objects.get(codename='change_user'))
        print self.user.get_all_permissions() # prints set([])
        self.assertTrue(self.user.has_perm('logical_change_user', self.non_staff.profile))

アクセス許可を追加した後でも、ユーザーにはまだアクセス許可がありません。これは、テスト中に何も作成することが許可されていないためですか (これは悪い習慣ですか?)? または、djangoは何らかの方法でアクセス許可をキャッシュしますか? setUp で権限を追加すると機能しますが、同じテスト中に変更したかった (権限のある場合とない場合のテスト)。

前もって感謝します!

4

1 に答える 1

22

のソース コードをModelBackend見ると、Django がユーザー オブジェクトのアクセス許可をキャッシュしていることがわかります。

キャッシュのワイプを試すこともできますが、将来キャッシュ メカニズムが変更された場合、テストが中断される可能性があります。最も簡単な方法は、テストでデータベースからユーザーを再取得することです。

from django.contrib.auth.models import Permission

def test_can_change_non_staff_users(self):
    self.assertFalse(self.user.has_perm('logical_change_user', self.non_staff.profile)) # can't change non staff users without permission

    # now add the permission and test it again
    self.user.user_permissions.add(Permission.objects.get(codename='change_user'))

    # refetch user from the database
    self.user = User.objects.get(pk=self.user.pk)
    print self.user.get_all_permissions() # should now include new permission
    self.assertTrue(self.user.has_perm('logical_change_user', self.non_staff.profile))
于 2012-04-11T09:30:08.330 に答える