2011-09-21 8 views
7

Me gustaría leer algunas variables de sesión de una prueba (Django TestCase)¿Cómo usar la sesión en TestCase en Django?

¿Cómo hacer eso de una manera limpia?

def test_add_docs(self): 
    """ 
    Test add docs 
    """ 
    # I would access to the session here: 
    self.request.session['documents_to_share_ids'] = [1] 

    response = self.client.get(reverse(self.document_add_view_id, args=[1]), follow=True) 
    self.assertEquals(response.status_code, 200) 
+0

...? Algunos ejemplos, por favor. –

Respuesta

11

Lamentablemente, esto no es tan fácil como se esperaba en este momento. Como habrás notado, simplemente usar self.client.session directamente no funcionará si no has llamado a otras vistas que han configurado las sesiones con las cookies de sesión apropiadas para ti. La tienda/cookie de sesión se debe configurar manualmente o a través de otras vistas.

Hay un billete abierto para que sea más fácil de sesiones simuladas con el cliente de prueba: https://code.djangoproject.com/ticket/10899

Además de la solución en el billete, hay un truco que se puede utilizar si está utilizando django.contrib.auth. El método de los clientes de prueba login() configura una tienda/cookie de sesión que se puede usar más adelante en la prueba.

Si tiene cualquier otra vista que establezca sesiones, solicitarlas también servirá (probablemente tenga otra vista que establezca sesiones, de lo contrario su vista que lee las sesiones será bastante inutilizable).

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

class YourTest(TestCase): 
    def test_add_docs(self): 
     # If you already have another user, you might want to use it instead 
     User.objects.create_superuser('admin', '[email protected]', 'admin') 

     # self.client.login sets up self.client.session to be usable 
     self.client.login(username='admin', password='admin') 

     session = self.client.session 
     session['documents_to_share_ids'] = [1] 
     session.save() 

     response = self.client.get('/') # request.session['documents_to_share_ids'] will be available 
+4

Solo una nota para todos: self.client.session tiene que asignarse a una variable. –

+0

Tenga en cuenta que https://code.djangoproject.com/ticket/10899 se cerró ("wontfix"). – Derek

0

Usted debe ser capaz de acceder a una Client 's variales sesión a través de su propiedad session, así que supongo self.client.session['documents_to_share_ids'] = [1] debe ser lo que usted está buscando!

8

A partir de Django 1.7+ esto es mucho más fácil. Asegúrese de establecer la sesión como una variable en lugar de hacer referencia directamente a ella.

def test_something(self): 
    session = self.client.session 
    session['somekey'] = 'test' 
    session.save() 

y la solución de thereaspelme solo es necesaria en las versiones anteriores de django. Ver docs

0

Si necesita para inicializar una sesión para la solicitud de pruebas para manipular directamente:

from django.contrib.sessions.middleware import SessionMiddleware 
from django.http import HttpRequest 


request = HttpRequest() 

middleware = SessionMiddleware() 
middleware.process_request(request) 

request.session.save() 
Cuestiones relacionadas