2012-04-11 63 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