在django中的unittest期间无法更改用户权限

Cla*_*ash 4 django django-testing django-permissions

我最终决定对我的应用程序进行一些测试,但是如果用户可以更改另一个用户,我会坚持测试(取决于用户的类型 - 我使用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))
Run Code Online (Sandbox Code Playgroud)

即使在添加权限后,我的用户仍然没有权限.这是因为我不允许在测试期间创建任何东西(这是一种不好的做法吗?)?或者django以某种方式缓存权限?如果我在setUp添加权限,它可以工作,但我想在同一个测试中更改它(使用和不使用权限进行测试).

提前致谢!

Ala*_*air 16

如果查看源代码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))
Run Code Online (Sandbox Code Playgroud)