2010-04-14 52 views
5

我正在爲我的視圖編寫詳細的功能測試,以補充我的模型上的單元測試。這是一個Django項目,我用unittest使用內置的Django測試框架。顯然,在這些功能測試中檢查的重要事情之一是權限設置正確。考慮到這一點,我試圖這樣的事情:在django測試中檢測權限錯誤

anonclient = Client() 
userclient = Client() 
userclient.login(username='test_user', password='test') 
adminclient = Client() 
adminclient.login(username='test_admin', password='test') 

path = "/path/to/my/page" 
anonresponse = anonclient.get(path) 
userresponse = userclient.get(path) 
adminresponse = adminclient.get(path) 

我需要能夠確認anonclient和userclient均被拒絕的權限,而正確的AdminClient工作。 Howerver,我無法找到一種方法來測試這發生了robustly

起初我決定檢查響應是302重定向(因爲重定向失敗的副作用),但這意味着不可能區分自動重定向用戶的功能和失敗的權限檢查。 (我不能只使用self.assertRedirects(response,url),因爲目標url可以通過視圖中permission_required裝飾器的login_url參數覆蓋!)

也許我應該考慮擴展user_passes_test修飾器,以便它添加如果測試失敗,則返回響應對象的屬性?這可以在測試中檢查。否則,我將不得不通過檢查請求的副作用是否發生來確定請求是否成功。這樣做會起作用,但它會非常長時間的囉嗦,特別是有很多這些檢查正在完成。

我無法想象我是第一個遇到這個問題的人,處理這個問題的正確方法是什麼,或者我錯過了什麼?

非常感謝!

回答

1

當您調用登錄方法時,django測試客戶端會返回布爾值,該方法會告訴您登錄是否成功。

[17] >>> from django.test import Client 
[18] >>> c = Client() 
[19] >>> c.login(username='superuser', password='bar') 
[19] : False 
[20] >>> c.login(username='superuser', password='correct_password') 
[20] : True 
+0

感謝賈斯汀,但你誤解了我的問題 - 我需要檢查後續獲取是否成功或者是否發生權限錯誤(導致重定向)。 登錄工作正常 - 我需要能夠測試權限檢查工作在Django視圖。 – adamnfish 2010-04-14 15:51:44

+0

您應該能夠檢查產生的網址是否是您嘗試訪問的網址。 my_url ='/ foo /' resp = c.get(my_url) 然後,您可以檢查與您的結果頁面相關的事件的resp對象。 docs.djangoproject。com/en/dev/topics/testing /#testing-responses具體而言,狀態代碼,檢查是否使用了正確的模板等。希望有幫助! – 2010-04-16 05:54:27

+0

正如我所說,我希望能夠區分服務重定向的視圖和未通過測試的用戶重定向的視圖。我知道我可以檢查副作用或嗅探結果頁面(實際上,這是我現在所做的),但我想知道是否有方法檢測用戶未通過測試並且視圖不是直接運行。 看來現在還沒有,所以我想我會在1.2版本之後提交一個功能請求,或者自己修改一個打補丁的user_passes_test裝飾器。 – adamnfish 2010-04-16 09:51:02

1

permission_required裝飾和PermissionRequiredMixin具有raise_exception參數。

處理這個問題的一種可能的方式是有一些像一個PERMISSIONS_RAISE_EXCEPTION=True配置選項在settings_test.py(如果您使用的測試運行一個單獨的設置,並有

from django.conf import settings 

@permission_required('<perm>', 
        raise_exception=settings.PERMISSIONS_RAISE_EXCEPTION) 
def your_view(...) 
    pass 

class YourView(PermissionRequired): 
    raise_exception = settings.PERMISSIONS_RAISE_EXCEPTION 

這樣你就可以趕上在您的測試的403,並保留重定向到登錄頁面異常/測試。

client.login('user', 'blah') 
response = client.get('/yourview') 
assertNot(403, response.status_code) 

添加設置將所有permission_required裝飾未必是你的味道,感覺有點像您將測試代碼添加到源代碼中,但這是迄今爲止我看到的唯一方法。