在django中的单元测试期间无法更改用户权限 [英] can't change user permissions during unittest in django

查看:119
本文介绍了在django中的单元测试期间无法更改用户权限的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我终于决定对我的应用程序进行一些测试,但是如果用户可以改变另一个用户,我会坚持测试(取决于用户的类型 - 我使用django-rule来做到逻辑许可检查,但这不重要)



这是我迄今为止的代码

 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))#不能更改非员工用户没有pe退出

#现在添加权限并再次测试
self.user.user_permissions.add(Permission.objects.get(codename ='change_user'))
打印自我。 user.get_all_permissions()#prints set([])
self.assertTrue(self.user.has_perm('logical_change_user',self.non_staff.profile))

即使添加权限,我的用户仍然没有权限。这是因为我在测试期间不允许创建任何东西(这是不好的做法吗?)?还是django缓存的权限不知何故?如果我在setUp中添加了许可,它可以正常工作,但是我想在同一测试中进行更改(在有和没有许可的情况下进行测试)。



提前感谢! p>

解决方案

如果您查看 ModelBackend ,您可以看到Django确实缓存了用户的权限对象。



您可以尝试擦除缓存,但如果缓存机制将来会发生变化,那么可能会破坏您的测试。最简单的做法是在测试中从数据库中提取用户。

  def test_can_change_non_staff_users(self):
self.assertFalse(self.user.has_perm('logical_change_user',self.non_staff.profile))#无法更改非员工用户未经许可

#现在添加权限并再次测试
self.user.user_permissions.add(Permission.objects.get(codename ='change_user'))

#从数据库refetch用户
self.user = User.objects。 get(pk = self.user.pk)
print self.user.get_all_permissions()#现在应该包含新的权限
self.assertTrue(self.user.has_perm('logical_change_user',self.non_staff。个人资料))


I've finally decided to make some tests for my apps but I'm stuck on testing if a user can change another user (depends on the type of the user -- I use django-rules to be able to do logical permission checks, but this is not important)

Here's the code I have so far

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

Even after adding the permission, my user still has no permissions. Is this because I'm not allowed to create anything during the tests (is this a bad practice?)? Or does django cache the permissions somehow? If I add the permission at setUp it works, but I wanted to change it during the same test (testing with and without the permission).

Thanks in advance!

解决方案

If you look at the source code for the ModelBackend, you can see that Django does cache the permissions on the user object.

You could try wiping the cache, but that could break your tests if the caching mechanism changes in future. The easiest thing to do is to refetch the user from the database in your test.

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

这篇关于在django中的单元测试期间无法更改用户权限的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆