2010-12-15 10 views
20

Meine Website Einzelpersonen für meine Inhalte in Abwesenheit wird angemeldet durch die Schaffung eines Benutzer basierend auf dem aktuellen session_keyWie kann ich die Sitzung in der Test-Framework Django ändern

Ich möchte Setup einen Test beitragen können sehen, aber es scheint, dass es nicht möglich ist, die request.session zu ändern:

ich möchte, dies zu tun:

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

aber ich bekomme die Fehlermeldung:

AttributeError: can't set attribute 

Denken Sie darüber nach, wie Sie die Client-Sitzung ändern, bevor Sie Anfragen erhalten? Ich habe gesehen this und es scheint nicht zu funktionieren

+0

'session' ist ein' dict' artiges Objekt, sollten Sie 'verwenden s [x]' zu erhalten und Sollwerte – xj9

Antwort

28

So habe ich es gemacht (inspiriert von einer Lösung in 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 

Danach können Sie Ihre Tests erstellen, wie:

class BlahTestCase(SessionTestCase): 

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

etc ...

+0

Funktioniert das immer noch mit Django 1.6 mit dem Pickle-Serializer (anstelle des jetzt Standard JSONSerializer für SESSION_SERIALIZER) –

0

Sie können die Sitzung mit einer middleware ändern.

33

Das Clientobjekt des django testing frameworks ermöglicht das Berühren der Sitzung. Schauen Sie sich http://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#django.test.client.Client.session für Details

Seien Sie vorsichtig: 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)

Ich denke, so etwas wie dies unten funktionieren sollte

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

Hallo Luc, vielen Dank für Ihre Hilfe, aber das funktioniert nicht. Ich erhalte den folgenden Fehler: AttributeError: 'dict' Objekt hat kein Attribut 'save' Dies tritt auf, weil das Objekt client.session ein Wörterbuch ist. Es scheint, dass client.session erst nach der Anforderung zu einem echten Session-Objekt wird (und nur dann, wenn ein Benutzer angemeldet ist). Irgendwelche anderen Vorschläge? Wiederholen Sie diesen Vorgang durch (von Shell) eingeben: von 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

Es sieht so aus, als ob luc vorgeschlagen sollte funktionieren, aber es ist ein Django-Bug: https://code.djangoproject.com/ticket/11475 –

+0

plus 1 wieder .. –

3

Sie können eine benutzerdefinierte Ansicht erstellen, die Dummy-Daten wie die Sitzung einfügt.

Die Ansicht mit der entsprechenden URL:/Dummy /:

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

als in Testskript rufen Sie einfach self.client.get('/dummy/')

Ich benutze diese Dummy-Ansicht auch die Dummy-Daten in der Sitzung initilize, wenn durch die Prüfung Hand.

10

Wie Andrew Austin bereits erwähnt, ist es nicht wegen dieser Fehler nicht funktioniert: https://code.djangoproject.com/ticket/11475

Was Sie tun können, ist dies:

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

Nach dem Erstellen und Anmelden eines Benutzers mit User.objects.create_user() und self.client.login(), wie im obigen Code, sollten Sitzungen funktionieren.

0

gemäß den docs Sie Werte an die Sitzung in der Test-Client über zB

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

hinzufügen Dies wird Ihnen Funktionen können testen, die Daten in der Sitzung erfordern ordnungsgemäß funktioniert.

Also für diese Frage:

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