не могу изменить права пользователя во время unittest в django

Наконец-то я решил провести некоторые тесты для своих приложений, но я застрял на тестировании, может ли пользователь изменить другого пользователя (зависит от типа пользователя - я использую правила django, чтобы иметь возможность выполнять логические проверки разрешений, но это не главное)

Вот код, который у меня есть до сих пор

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, оно сработает, но я хотел изменить его во время того же теста (тестирование с разрешением и без него).

Заранее спасибо!


person Clash    schedule 11.04.2012    source источник


Ответы (1)


Если вы посмотрите на исходный код для 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))
person Alasdair    schedule 11.04.2012
comment
огромное спасибо! глупый я, я попытался повторно зарегистрировать пользователя, но не пытался повторно загрузить пользователя. это плохая практика, чтобы добавить разрешение во время теста? Спасибо! - person Clash; 11.04.2012
comment
Я думаю, вы можете добавить разрешение во время тестового примера, я не думаю, что это плохая практика. - person Alasdair; 11.04.2012