2012-07-03 74 views
0

我有一個測試類,測試所有頁面訪問不同的用戶。如何測試403錯誤?

這些訪問由裝飾器在我的每個視圖中定義。

views.py:

@login_required 
def afficher(request): 
    ... 
    ... 

@creation_permission_required 
def ajouter(request): 
    ... 
    ... 

一些裝飾都是由我定義。

decorators.py:

def creation_permission_required(function): 
    @wraps(function) 
    @login_required 
    def decorateur(request, *k, **a): 
     user = get_object_or_404(User, username__iexact=request.user.username) 
     if user.is_superuser or user.get_profile().creation: 
      return function(request, *k, **a) 
     else: 
      return HttpResponseRedirect(reverse("non_autorise"))# <--- PROBLEM 
    return decorateur 
    return function 

當我測試他們,我用的是STATUS_CODE屬性,以驗證用戶可以訪問或無法在網頁

test.py:

c = Client() 
c.login(username='aucun', password='aucun') 
for url in self.url_aucun: 
    r = c.get(reverse(url['url'], args=url['args'])) 
    self.assertEqual(r.status_code, 200) 
for url in self.url_creation: 
    r = c.get(reverse(url['url'], args=url['args'])) 
    self.assertEqual(r.status_code, 302)  # <--- SECOND PROBLEM 

當用戶沒有訪問頁面的權限時,頁面應該返回403錯誤或(禁止)。我怎樣才能測試403而不是302?

編輯:我試圖使用HttpResponseForbidden(反向(「non_autorise」)),但無法獲得任何內容。於是我試圖讓自己的HttpResponse這是完全相同的副本HttpResponseRedirect但與其他STATUS_CODE(403)仍然沒有得到任何內容...

decorators.py:

class HttpResponseTest(HttpResponse): 
    def __init__(self, redirect_to): 
     super(HttpResponseTest, self).__init__() 
     self['Location'] = iri_to_uri(redirect_to) 
     self.status_code = 403 

def creation_permission_required(function): 
    @wraps(function) 
    @login_required 
    def decorateur(request, *k, **a): 
     user = get_object_or_404(User, username__iexact=request.user.username) 
     if user.is_superuser or user.get_profile().creation: 
      return function(request, *k, **a) 
     else: 
      return HttpResponseTest(reverse("non_autorise"))# <--- PROBLEM 
    return decorateur 
    return function 
+0

你想重定向到「non_autorise」視圖嗎?還是你想要一個狀態碼302?你不能擁有兩個。 –

+0

我不能?因爲這正是我想要的:403代碼+重定向 – BlueMagma

+0

問題不再是關於我問的問題了,所以我開始一個新的問題,它更精確地關於我想要的:http://stackoverflow.com/questions/11324909/重定向-403-錯誤 – BlueMagma

回答

0
self.assertEqual(r.status_code, 403) 
+0

或者我在這裏錯過了什麼? –

+0

事實上,問題真的出現在使用HttpResponseRedirect()的裝飾器中,但是我不知道如何在沒有它的情況下做同樣的事情 – BlueMagma

0

我有這個相同的問題,並通過指示測試get()遵循重定向使用follow=True來解決它。使用BlueMagma的例子,它看起來像這樣:

for url in self.url_creation: 
    r = c.get(reverse(url['url'], args=url['args']), follow=True) 
    self.assertEqual(r.status_code, 403)  # <--- SECOND PROBLEM NO MORE!!! 

希望這可以幫助別人!