2012-04-11 1 views
4

Я, наконец, решил сделать некоторые тесты для своих приложений, но я застрял на тестировании, если пользователь может изменить другого пользователя (зависит от типа пользователя - I использовать Джанго-правила, чтобы иметь возможность делать логические проверки разрешений, но это не важно)не может изменять разрешения пользователя во время unittest в 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, он работает, но я хотел бы изменить его во время одного теста (тестирование с разрешения и без него).

Заранее благодарен!

ответ

13

Если вы посмотрите на исходный код для ModelBackend, вы увидите, что Django кэширует разрешения для объекта пользователя.

Вы можете попробовать очистить кеш, но это может сломать ваши тесты, если механизм кэширования изменится в будущем. Проще всего сделать это, чтобы восстановить пользователя из базы данных в вашем тесте.

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)) 
+0

большое спасибо! глупый, я попытался переустановить пользователя, но не попробовал переназначить пользователя. неужели плохая практика заключается в добавлении разрешения во время теста? благодаря! – Clash

+0

Я думаю, что вы можете добавить разрешение во время тестового примера, я не думаю, что это плохая практика. – Alasdair