47 votos

La prueba de que el usuario se ha conectado correctamente

¿Cómo puedo probar que un usuario se registra, después de enviar el formulario de inscripción?

He intentado lo siguiente pero devuelve True incluso antes de añadir el inicio de sesión de la lógica para el registro de mi vista.

def test_that_user_gets_logged_in(self):
    response = self.client.post(reverse('auth-registration'), 
                                { 'username':'foo', 
                                  'password1':'bar', 
                                  'password2':'bar' } )

    user = User.objects.get(username='foo')
    assert user.is_authenticated()

El código que está siendo probado:

class RegistrationView(CreateView):
    template_name = 'auth/registration.html'
    form_class = UserCreationForm
    success_url = '/'

    def auth_login(self, request, username, password):
        '''
        Authenticate always needs to be called before login because it
        adds which backend did the authentication which is required by login.
        '''

        user = authenticate(username=username, password=password)
        login(request, user)

    def form_valid(self, form):
        '''
        Overwrite form_valid to login.
        '''

        #save the user
        response = super(RegistrationView, self).form_valid(form)

        #Get the user creditials
        username = form.cleaned_data['username']
        password = form.cleaned_data['password1']

        #authenticate and login
        self.auth_login(self.request, username, password)

        return response

68voto

emyller Puntos 829

El método más directo para probar si un usuario se registra en es probando el objeto de Cliente:

self.assertIn('_auth_user_id', self.client.session)

También puede comprobar si un usuario se registra en:

self.assertEqual(self.client.session['_auth_user_id'], user.pk)

Como información adicional, el response.request objeto no es un HttpRequest objeto; al contrario, es una ordinaria dict con un poco de información acerca de la solicitud real, por lo que no tienen la user atributo de todos modos.

También, las pruebas de la response.context objeto no es seguro porque no aways tener un contexto.

9voto

Jonatan Littke Puntos 2733

Django es TestClient tiene un método de inicio de sesión que devuelve True si el usuario se haya conectado correctamente.

5voto

Bernhard Vallant Puntos 18035

El método is_authenticated() sobre el User modelo siempre devuelve True. False es devuelto por request.user.is_authenticated() en el caso de que request.user es una instancia de AnonymousUserque is_authenticated() método siempre devuelve False. Durante la prueba de que usted puede tener una mirada en response.context['request'].user.is_authenticated().

También puede intentar acceder a otra página en la prueba que se requiere para estar conectado, y ver si response.status devuelve 200 o 302 (redirección de login_required).

1voto

Thierry Lam Puntos 7888

De donde eres de iniciar su self.client? ¿Qué otra cosa es en su setUp método? Tengo una prueba similar y su código debería funcionar bien. He aquí cómo lo hago:

from django.contrib.auth.models import User
from django.test import TestCase
from django.test.client import Client


class UserTestCase(TestCase):

    def setUp(self):
        self.client = Client()

    def testLogin(self):
        print User.objects.all() # returns []
        response = self.client.post(reverse('auth-registration'), 
                            { 'username':'foo', 
                              'password1':'bar', 
                              'password2':'bar' } )
        print User.objects.all() # returns one user
        print User.objects.all()[0].is_authenticated() # returns True

EDITAR

Si yo comente mi nombre de usuario de la lógica, no entiendo que cualquier Usuario después de la self.client.post(. Si usted realmente desea para comprobar si el usuario ha sido autenticado, el uso de la self.client para acceder a otra dirección url que requiere autenticación de usuario. Continuando con lo anterior, el acceso a otra página:

response = self.client.get(reverse('another-page-which-requires-authentication'))
print response.status_code

La anterior debe devolver 200 para confirmar que el usuario se ha autenticado. Otra cosa, se le redirigirá a la página de inicio de sesión con un 302 del código.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X