在django中的单元测试期间无法更改用户权限 [英] can't change user permissions during unittest in django
问题描述
这是我迄今为止的代码
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屋!