2011-09-21 7 views
7

Chciałbym przeczytać niektóre zmienne sesji z testu (Django TestCase)Jak korzystać z sesji w TestCase w Django?

Jak to zrobić w czysty sposób?

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

...? Proszę podać przykłady. –

Odpowiedz

11

Niestety, nie jest to łatwe, na co w tej chwili można liczyć. Jak już pewnie zauważyliście, samo użycie self.client.session bezpośrednio nie zadziała, jeśli nie wywołaliście innych widoków, które skonfigurowały sesje z odpowiednimi plikami cookie sesji. Sesja sesji/cookie musi być następnie skonfigurowana ręcznie lub za pomocą innych widoków.

Jest otwarty bilet łatwiej sesjach próbnych z klientem testowym: https://code.djangoproject.com/ticket/10899

Oprócz obejścia w bilecie, istnieje trik, który może być używany, jeśli używasz django.contrib.auth. Metoda klientów testowych login() ustawia plik sesji/plik cookie sesji, który może być użyty w dalszej części testu.

Jeśli masz jakieś inne widoki, które ustawiają sesje, prośba o nie również zrobi lewę (prawdopodobnie masz inny widok, który ustawia sesje, w przeciwnym razie twój widok odczytujący sesje będzie całkiem nieużyteczny).

+4

Uwaga dla wszystkich: self.client.session musi zostać przypisana do zmiennej. –

+0

Należy zauważyć, że https://code.djangoproject.com/ticket/10899 został zamknięty ("wontfix"). – Derek

0

Powinieneś być w stanie uzyskać dostęp do Client „s sesji variales poprzez session nieruchomości, więc myślę, że powinno być self.client.session['documents_to_share_ids'] = [1] czego szukasz!

8

Od Django 1.7+ jest to znacznie łatwiejsze. Upewnij się, że sesja została ustawiona jako zmienna, a nie bezpośrednio.

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

Obejście problemu andreaspelme jest potrzebne tylko w starszych wersjach django. Zobacz docs

0

Jeśli trzeba zainicjować sesję na życzenie w testach manipulować go bezpośrednio:

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


request = HttpRequest() 

middleware = SessionMiddleware() 
middleware.process_request(request) 

request.session.save() 
Powiązane problemy