2013-02-02 79 views
4

我想將單元測試引入Django應用程序。儘管我開始嘗試做第一件事情時失敗了。你能告訴我我做錯了什麼嗎?單元測試權限

我想測試

@user_passes_test(lambda u: u.has_module_perms('myModule')) 
def myView(request): 
    ...someCode... 

我想考user_passes_test位的觀點,我也有更復雜的測試,所以我想知道如果我的測試,讓正確的用戶,只有他們訪問視圖。我專注於那些不起作用的位,並簡化了一下。

from django.contrib.auth.models import User 
from django.test import TestCase 
from settings import DJANGO_ROOT 

class PermissionsTestCase(TestCase): 
    fixtures = [DJANGO_ROOT + 'testdata.json'] 

    def setUp(self): 
     self.user = User.objects.create(username='user', password='pass') 
     self.user.save() 

    def test_permissions_overview(self): 
     url = '/secret/' 

     #User not logged in (guest) 
     response = self.client.get(url) 
     self.assertRedirects(response, 'http://testserver/accounts/login/?next=/secret/') 

     #Logged in user that should not be able to see this page 
     response = self.client.get(url) 
     self.client.login(username='user', password='pass') 
     self.assertRedirects(response, 'http://testserver/accounts/login/?next=/secret/') 

     #Logged in user that has 'myModule' module permissions 
     self.user.user_permissions.add('myModule.view_myThing') 
     self.user.save() 
     self.assertTrue(self.user.has_module_perms('myModule')) #This one fails 
     self.client.login(username='user',password='pass') 
     response = self.client.get(url) 
     self.assertContains(response, "What to look for") #This one too 

而最後一位仍然失敗。權限沒有通過。有任何想法嗎?

+0

'self.user.user_permissions.add('myModule.view_myThing')'不能工作。關於爲什麼它不能工作的答案可以在這裏找到:[向Django用戶對象添加用戶權限時發生無效的文字錯誤](http://stackoverflow.com/questions/10131271/invalid-literal-error-when-adding -a-user-permission-to-a-django-user-object) – Louis

+0

你必須在user_permissions.add()方法內傳遞一個Permission對象。你不能只傳遞一個字符串。 – user208859

回答

4

這將不轉換密碼散列

User.objects.create(username='user', password='pass') 

的正確方法創建用戶:

User.objects.create_user(username='user', password='pass') 

這裏充滿了總結

>>> from django.contrib.auth.models import User 
>>> x=User.objects.create(username='user', password='pass')  
>>> x.password 
'pass' 
>>> from django.test import Client 
>>> c = Client() 
>>> c.login(username='user',password='pass') 
False 

# But create_user works 
>>> y=User.objects.create_user(username='user2', password='pass')  
>>> y.password 
u'pbkdf2_sha256$12000$oh55gfrnCZn5$hwGrkUZx38siegWHLXSYoNDT2SSP1M5+Whh5PnJZD8I=' 
>>> c.login(username='user2',password='pass') 
True 
+0

謝謝,幾乎忘記了這一點,但你又提高了我們的單元測試!儘管如此愚蠢的錯誤:/ – timovdw

-1

權限是字符串。

# this tests to see if a user has 'myModule' 
@user_passes_test(lambda u: u.has_module_perms('myModule')) 

#gives the user a completely different permission called 'myModule.view_myThing' 
self.user.user_permissions.add('myModule.view_myThing') 

#tests to see if user has a permission called 'myModule' which is not 'myModule.view_myThing' 
self.assertTrue(self.user.has_module_perms('myModule')) 

根據你寫的內容我不能推斷你的意圖,但你至少有2個不同的權限,你試圖添加/檢查。我會改變你給用戶的權限如下: self.user.user_permissions.add(「Mymodule中」)