2010-04-24 12 views
8

Próbuję utworzyć test dla widoku, który jest ozdobiony @login_required, ponieważ nie udało mi się go uruchomić, wykonałem prosty test i nadal nie mogę zmusić do przejścia.Django: test kończy się niepowodzeniem w widoku z @login_required

Oto kod do prostego testu i widok:

def test_login(self): 
    user = self._create_new_user() 
    self.assertTrue(user.is_active) 
    login = self.client.login(username=user.username, 
password=self.data['password1']) 
    self.failUnless(login, 'Could not log in') 
    response = self.client.get('/accounts/testlogin/') 
    self.assertEqual(response.status_code, 200) 

@login_required 
def testlogin(request): 
    print 'testlogin !! ' 
    return HttpResponse('OK') 

_create_new_user() oszczędza użytkownikowi i nie jest test wewnątrz tej metody aby zobaczyć, że działa.

test nie powiedzie się w response.status_code, wracając 302 i wystąpienie reakcji jest z HttpResponseRedirect, przekierowuje go jako jeśli nie zalogowany.

jakiś trop? Czegoś mi brakuje?

Pozdrowienia Esteban

Odpowiedz

3

Oto odpowiedź:

Python 2.6.5 dokonane zmiany w sposobie ciasteczka są przechowywane, która jest niezgodna z subtelnie klienta testowego. Ten problem został naprawiony w gałęziach 1.1.X i trunk, ale poprawka nie została jeszcze wprowadzona do formalnego wydania .

Jeśli korzystasz z wersji 1.1.X i Python 2.6.5, wystąpią problemy z każdą aktywnością testową związaną z plikami cookie . Musisz albo zmienić wersję na Python, albo użyć gałęzi 1.1.X raczej niż wersja 1.1.1.

1.1.2 uwalnianie (które obejmą poprawkę opisać problemu) będzie być wykonane w tym samym czasie, że wydamy 1.2 - mam nadzieję, bardzo wkrótce.

Pozdrawiam, Russ Magee% -)

http://groups.google.com/group/django-users/browse_frm/thread/617457f5d62366ae/05f0c01fff0b9e6d?hl=en&lnk=gst&q=2.6.5#05f0c01fff0b9e6d

21

testcase ta działa dla mnie:

from django.contrib.auth.models import User 
from django.core.urlresolvers import reverse 
from django.test.client import Client 
import unittest 

class LoginTestCase(unittest.TestCase): 
    def setUp(self): 
     self.client = Client() 
     self.user = User.objects.create_user('john', '[email protected]', 'johnpassword') 

    def testLogin(self): 
     self.client.login(username='john', password='johnpassword') 
     response = self.client.get(reverse('testlogin-view')) 
     self.assertEqual(response.status_code, 200) 

Proponuję (jeśli nie już z nich korzystać), aby użyć wsteczny() funkcję i wymienić adresy URL . W ten sposób masz pewność, że zawsze otrzymujesz właściwy adres URL.

+0

@aeby: I skopiowany i wklejony kod i jeszcze dostać 302, używasz @login_required w swoim widoku? –

+0

Django wersja 1.1.1 - Pokój zaznaczone, że widok testlogin działa w przeglądarce i że jest dostępny tylko przez zalogowanego użytkownika –

+0

Tak zrobię: z django.contrib.auth.decorators import login_required @login_required def testlogin (request): return HttpResponse ("Test") –

0

OK miałem stoi sam problem @resto rozwiązać mój problem.

tworząc w ten sposób użytkownikowi poniżej, pozwala klient testowy dostać zalogowanego użytkownika i uzyskać odpowiedź inną niż przekierowanie (302)

self.user = User.objects.create_user('john', '[email protected]', 'johnpassword') 
Powiązane problemy