2011-09-21 16 views
7

Mi piacerebbe leggere alcune variabili di sessione da un test (Django TestCase)Come utilizzare la sessione in TestCase in Django?

Come farlo in modo pulito?

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

...? Alcuni esempi, per favore. –

risposta

11

Sfortunatamente, questo non è facile come speri al momento. Come avrai notato, l'utilizzo di self.client.session direttamente non funzionerà se non hai chiamato altre visualizzazioni che hanno impostato le sessioni con i cookie di sessione appropriati per te. Lo store/cookie di sessione deve quindi essere impostato manualmente o tramite altre visualizzazioni.

C'è un biglietto aperto per rendere più facile per le sessioni di finta con il client di prova: https://code.djangoproject.com/ticket/10899

Oltre alla soluzione nel biglietto, c'è un trucco che può essere utilizzato se si utilizza django.contrib.auth. Il metodo client di prova login() imposta un archivio/cookie di sessione che può essere utilizzato successivamente nel test.

Se si dispone di altre viste che impostano le sessioni, la richiesta verrà eseguita anche con il trucco (probabilmente si avrà un'altra vista che imposta le sessioni, altrimenti la vista che legge le sessioni sarà piuttosto inutilizzabile).

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

class YourTest(TestCase): 
    def test_add_docs(self): 
     # If you already have another user, you might want to use it instead 
     User.objects.create_superuser('admin', '[email protected]', 'admin') 

     # self.client.login sets up self.client.session to be usable 
     self.client.login(username='admin', password='admin') 

     session = self.client.session 
     session['documents_to_share_ids'] = [1] 
     session.save() 

     response = self.client.get('/') # request.session['documents_to_share_ids'] will be available 
+4

Solo una nota per tutti: self.client.session deve essere assegnato a una variabile. –

+0

Si noti che https://code.djangoproject.com/ticket/10899 è stato chiuso ("wontfix"). – Derek

0

Si dovrebbe essere in grado di accedere a una sessione Client s' variales attraverso la sua proprietà session, quindi credo che self.client.session['documents_to_share_ids'] = [1] dovrebbe essere quello che stai cercando!

8

A partire da Django 1.7+ questo è molto più semplice. Assicurati di impostare la sessione come variabile invece di fare riferimento direttamente.

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

La soluzione di andreaspelme è necessaria solo nelle versioni precedenti di django. Vedere docs

0

Se è necessario inizializzare una sessione per la richiesta nei test di manipolare direttamente:

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


request = HttpRequest() 

middleware = SessionMiddleware() 
middleware.process_request(request) 

request.session.save() 
Problemi correlati