не может изменить права пользователя во время юнит-теста в django

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

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

<code>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))
</code>

Даже после добавления разрешения у моего пользователя все еще нет разрешений. Это потому, что мне не разрешено создавать что-либо во время тестов (это плохая практика?)? Или django как-то кеширует разрешения? Если я добавляю разрешение в setUp, оно работает, но я хотел изменить его во время того же теста (тестирование с и без разрешения).

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

Ответы на вопрос(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))
 Clash11 апр. 2012 г., 11:42
большое спасибо! глупый я, я пытался заново зарегистрировать пользователя, но не пытался повторно установить пользователя. Это плохая практика, чтобы добавить разрешение во время теста? Спасибо!
 11 апр. 2012 г., 11:50
Я думаю, что вы можете добавить разрешение во время теста, я не думаю, что это плохая практика.

Ваш ответ на вопрос