2014-04-16 34 views
0

請幫助修復授權的單元測試。如何編寫授權測試?

views.py:

from django.http import HttpResponse, HttpResponseRedirect, Http404 
from django.template import loader, RequestContext 
from django.contrib import auth 
from django import forms 

def auth_view(request): 
    username = request.POST.get('username', '') 
    password = request.POST.get('password', '') 
    user = auth.authenticate(username=username, password=password) 

    if user is not None: 
     auth.login(request, user) 
     return HttpResponseRedirect('/accounts/loggedin/') 
    else: 
     return HttpResponseRedirect('/accounts/invalid_login/') 

的login.html:

{% extends "base.html" %} 

{% block title %}Login{% endblock %} 

{% block content %} 
    {# {{ form.as_p }} #} 

    {% if form.errors %} 
     <p>errors!</p> 
    {% endif %} 

    <form action="/accounts/auth/" method="post">{% csrf_token %} 
     <input type="text" name="username" id="isername" value="" /> 

     <input type="password" name="password" id="password" value="" /> 

     <input type="submit" value="login" /> 
    </form> 
{% endblock %} 

urls.py:

from django.conf.urls import patterns, include, url 
from django.contrib.staticfiles.urls import staticfiles_urlpatterns 
from django.contrib import admin 
from django.conf import settings 

admin.autodiscover() 

urlpatterns = patterns('accounts', 
    url(r'^login/$', 'views.login'), 
    url(r'^auth/$', 'views.auth_view'), 
) 

tests.py:

from django.test import TestCase 
from django.test.client import Client 


class TestLogin(TestCase): 
    def test_login(self): 
     client = Client() 
     response = client.post('/accounts/auth/', {'username': 'qwe', 'password': 'qwe'}) 
     print(response.content) 
     self.assertEqual(response.status_code, 302) 

我正在做2個測試:一個用於現有用戶(用戶名:qwe,密碼:qwe),2用於不存在的用戶(用戶名:qwerty,密碼:qwe)。由於控制檯顯示相同的message

,所以我不知道成功與否授權

+0

您是否使用該密碼創建了用戶?在提出請求之前,用戶必須存在於測試數據庫中。 –

+0

對於這兩種情況,您都會返回完全相同的響應。您應該返回不同類型的響應或測試'response'對象的內容 – yorodm

回答

0

我假設你正在測試認證因爲這是你的代碼怎麼說。既然你返回相同的HTTP狀態碼,你的用戶都會在你的測試中傳遞斷言。更改auth_view方法來做到這一點:

if user is not None: 
     auth.login(request, user) 
     return HttpResponseRedirect('/accounts/loggedin/') 
    else: 
     return HttpResponseForbidden() 

所以,當你這樣做:

self.assertEqual(response.status_code, 302) 

它只會通過現有的用戶。