期间在Django单元测试不能修改用户权限(can't change user permis

2019-07-28 22:20发布

我终于决定把我的应用程序的一些测试,但我卡上的测试,如果用户可以更改其他用户(取决于用户的类型 - 我使用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的缓存的权限,不知何故? 如果我在设置添加允许它的工作原理,但我想相同的测试(有或无许可测试)过程中更改它。

提前致谢!

Answer 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))


文章来源: can't change user permissions during unittest in django