2010-12-15 5 views
20

Mi sitio permite a los individuos a contribuir con contenido en ausencia de ser conectado mediante la creación de un usuario en base a la session_key actual¿Cómo modifico la sesión en el marco de pruebas de Django

me gustaría configurar una prueba para mi ver, pero parece que no es posible modificar la request.session:

me gustaría hacer esto:

from django.contrib.sessions.models import Session 
s = Session() 
s.expire_date = '2010-12-05' 
s.session_key = 'my_session_key' 
s.save() 
self.client.session = s 
response = self.client.get('/myview/') 

pero me sale el error:

AttributeError: can't set attribute 

¿Pensamientos sobre cómo modificar la sesión del cliente antes de realizar solicitudes de obtención? He visto this y parece que no funciona

+0

'session' es un objeto' dict' similar, se debe utilizar 's [x]' para mostrar y valores establecidos – xj9

Respuesta

28

Así es como lo hice (inspirado en una solución en http://blog.mediaonfire.com/?p=36).

from django.test import TestCase 
from django.conf import settings 
from django.utils.importlib import import_module 

class SessionTestCase(TestCase): 
    def setUp(self): 
     # http://code.djangoproject.com/ticket/10899 
     settings.SESSION_ENGINE = 'django.contrib.sessions.backends.file' 
     engine = import_module(settings.SESSION_ENGINE) 
     store = engine.SessionStore() 
     store.save() 
     self.session = store 
     self.client.cookies[settings.SESSION_COOKIE_NAME] = store.session_key 

Después de eso, usted puede crear sus pruebas como:

class BlahTestCase(SessionTestCase): 

    def test_blah_with_session(self): 
     session = self.session 
     session['operator'] = 'Jimmy' 
     session.save() 

etc ...

+0

¿Esto todavía funciona con django 1.6 utilizando el serializador Pickle (en lugar del estándar ahora JSONSerializer para SESSION_SERIALIZER) –

33

El objeto cliente del marco de prueba django hace posible tocar la sesión. Mira http://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#django.test.client.Client.session para más detalles

CUIDADO: To modify the session and then save it, it must be stored in a variable first (because a new SessionStore is created every time this property is accessed)

creo que algo como esto debería funcionar por debajo de

s = self.client.session 
s.update({ 
    "expire_date": '2010-12-05', 
    "session_key": 'my_session_key', 
}) 
s.save() 
response = self.client.get('/myview/') 
+8

Hola Luc, gracias por su ayuda, pero esto no funciona Me aparece el siguiente error: AttributeError: el objeto 'dict' no tiene ningún atributo 'guardar' Esto ocurre porque el objeto client.session es un diccionario. Parece que client.session solo se convierte en un verdadero objeto de sesión después de que se realiza la solicitud (y solo si un usuario está conectado). ¿Cualquier otra sugerencia? puede repetir este mediante la introducción de (a partir de una cáscara): de django.test importación Client cliente = cliente() s = client.session s [ 'EXPIRE_DATE'] = '2010-12-05' s ['session_key'] = 'my_session_key' s.save() – Riley

+5

Parece que lo que Luc sugirió debería funcionar, pero es un error de django: https://code.djangoproject.com/ticket/11475 –

+0

plus 1 again .. –

3

Se puede crear una vista personalizada que inserta datos ficticios como la sesión.

La vista con la URL correspondiente:/maniquí /:

def dummy(request): 
    # dummy init data 
    request.session['expiry_date'] = '2010-12-05' 
    return HttpResponse('Dummy data has been set successfully') 

Que en escritura de la prueba a llamar a self.client.get('/dummy/')

También utilizo este punto de vista ficticio para initilize los datos ficticios en la sesión cuando se prueba por mano.

10

Como Andrew Austin ya se ha mencionado, no funciona debido a este error: https://code.djangoproject.com/ticket/11475

Lo que puedes hacer es esto:

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

class SessionTestCase(TestCase): 
    def setUp(self): 
     self.client = Client() 
     User.objects.create_user('john', '[email protected]', 'johnpassword') 
     self.client.login(username='john', password='johnpassword') 

    def test_something_with_sessions(self): 
     session = self.client.session 
     session['key'] = 'value' 
     session.save() 

Después de crear e iniciar sesión en un usuario con User.objects.create_user() y self.client.login(), como en el código anterior, las sesiones deberían funcionar.

0

según la documentación se puede añadir valores a la sesión en el cliente de prueba a través de por ejemplo

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

https://docs.djangoproject.com/en/dev/topics/testing/tools/#django.test.Client.session

Esto le permitirá probar vistas que requieren datos en la sesión para funcionar correctamente.

Así, por esta pregunta: ¿

session = self.client.session 
    session['expire_date'] = '2010-12-05' 
    ..... 
    session.save() 
Cuestiones relacionadas