2010-12-15 22 views
20

Moja witryna umożliwia jednostkom przyczynić zawartość w przypadku braku jest zalogowany tworząc Użytkownika w oparciu o aktualną session_keyJak zmodyfikować sesję w ramach testu Django

Chciałbym konfiguracja test dla mojego przeglądać, ale wydaje się, że nie jest możliwe, aby zmodyfikować request.session:

chciałbym to zrobić:

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

ale pojawia się błąd:

AttributeError: can't set attribute 

Zastanawiasz się, jak zmodyfikować sesję klienta przed wykonaniem żądania pobrania? Widziałem this i wygląda na to, że nie działa

+0

'session' jest' dict' podobny przedmiot, należy użyć 's [x]' do pobierania i ustawiania wartości – xj9

Odpowiedz

28

Tak to zrobiłem (zainspirowany rozwiązaniem w wersji 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 

Po tym, można tworzyć testy jak:

class BlahTestCase(SessionTestCase): 

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

etc ...

+0

Czy to nadal działa z django 1.6 przy użyciu serializatora Pickle (zamiast standardowego JSONSerializer dla SESSION_SERIALIZER) –

33

Obiekt klienta struktury testowania django umożliwia dotknięcie sesji. Spójrz na http://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#django.test.client.Client.session szczegółowe informacje

Bądź ostrożny: 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)

Myślę, że coś jak to powinno działać poniżej

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

Hi Luc, dzięki za pomoc, ale to nie działa. Pojawia się następujący błąd: AttributeError: Obiekt "dict" nie ma atrybutu "zapisz" Dzieje się tak, ponieważ obiekt client.session jest słownikiem. Wydaje się, że client.session staje się prawdziwym obiektem Session po wysłaniu żądania (i tylko wtedy, gdy użytkownik jest zalogowany). Jakieś inne sugestie? można powtórzyć po wprowadzeniu (z powłoki) z django.test importu klienta klienta = klienta() s = client.session y [ 'EXPIRE_DATE'] = '2010-12-05' s ['session_key'] = 'my_session_key' s.save() – Riley

+5

Wygląda na to, co zalecił luc, ale jest to błąd django: https://code.djangoproject.com/ticket/11475 –

+0

plus 1 ponownie .. –

3

Można utworzyć widok niestandardowy, który wstawia dane fikcyjne, takie jak sesji.

Widok z odpowiednim adresem URL:/atrapa /:

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

niż w scenariuszu testowym zadzwoń self.client.get('/dummy/')

ja również użyć tego manekina widok na initilize dane manekina w sesji podczas testowania przez dłoń.

10

Jak Andrew Austin już wspomniano, to nie działa z powodu tego błędu: https://code.djangoproject.com/ticket/11475

Co można zrobić, choć jest to:

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

Po utworzeniu i zalogowaniu użytkownika z User.objects.create_user() i self.client.login(), jak w powyższym kodzie, sesje powinny działać.

0

zgodnie docs można dodać wartości do sesji w kliencie testowym poprzez np

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

To pozwoli Ci przetestować widoki, które wymagają danych w sesji, aby funkcjonować poprawnie.

Tak na to pytanie:

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