2010-12-15 48 views
20

Mon site permet aux individus de contribuer au contenu en l'absence d'être connecté en créant un utilisateur sur la base session_key actuelleComment puis-je modifier la session dans le cadre de test Django

Je voudrais installer un test pour mon vue, mais il semble qu'il ne soit pas possible de modifier le request.session:

Je voudrais faire ceci:

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/') 

mais je reçois l'erreur:

AttributeError: can't set attribute 

Réflexion sur la façon de modifier la session client avant d'effectuer des demandes d'accès? J'ai vu this et cela ne semble pas fonctionner

+0

'' session' est un objet dict' semblable, vous devez utiliser 's [x]' pour obtenir et définir des valeurs – xj9

Répondre

28

Voici comment je l'ai fait (inspiré par une solution dans 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 

Après cela, vous pouvez créer vos tests comme:

class BlahTestCase(SessionTestCase): 

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

etc ...

+0

Cela fonctionne-t-il toujours avec django 1.6 en utilisant le sérialiseur Pickle (au lieu du JSONSerializer maintenant standard pour SESSION_SERIALIZER) –

0

Vous pouvez modifier la session avec un middleware.

33

L'objet client de la structure de test django permet de toucher la session. Regardez http://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#django.test.client.Client.session pour plus de détails

Attention: 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)

Je pense que quelque chose comme ça ci-dessous devrait fonctionner

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

Salut Luc, merci pour votre aide, mais cela ne fonctionne pas. J'obtiens l'erreur suivante: AttributeError: l'objet 'dict' n'a aucun attribut 'save' Cela se produit car l'objet client.session est un dictionnaire. Il semble que client.session ne devienne un vrai objet de session qu'une fois la requête faite (et seulement si un utilisateur est connecté). D'autres suggestions? Vous pouvez répéter en entrant (d'obus): de django.test import client client = client() s = client.session s [ 'expire_date'] = '2010-12-05' s ['session_key'] = 'my_session_key' s.save() – Riley

+5

Il ressemble à ce que Luc a suggéré devrait fonctionner, mais c'est un bug django: https://code.djangoproject.com/ticket/11475 –

+0

plus 1 encore .. –

3

Vous pouvez créer une vue personnalisée qui insère des données fictives telles que la session.

La vue avec l'URL correspondante:/mannequin /:

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

Than dans le script de test il suffit d'appeler self.client.get('/dummy/')

J'utilise aussi ce point de vue factice pour initilize les données fictives dans la session lors du test par main.

10

Comme Andrew Austin déjà mentionné, il ne fonctionne pas à cause de ce bug: https://code.djangoproject.com/ticket/11475

Ce que vous pouvez faire est cependant:

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() 

Après la création et la connexion d'un utilisateur avec User.objects.create_user() et self.client.login(), comme dans le code ci-dessus, les sessions devraient fonctionner.

0

selon les documents que vous pouvez ajouter des valeurs à la session dans le client de test via par exemple

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

Cela vous permettra de tester des vues qui nécessitent des données de la session pour fonctionner correctement.

Donc, pour cette question:

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