2012-04-11 61 views
4

我终于决定为我的应用程序做一些测试,但我坚持测试用户是否可以更改其他用户(取决于用户的类型 - 我使用Django的规则,能够做到逻辑权限检查,但是这并不重要)在单元测试期间无法更改用户权限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 2012-04-11 09:42:12

+0

我认为你可以在测试用例中添加权限,我不认为这是不好的做法。 – Alasdair 2012-04-11 09:50:06