2013-01-18 7 views
9

Ho un test unitario che ha esito negativo in un'asserzione che passa in un altro test nella stessa classe del test case.La risposta del client di prova dell'unità Django ha un contesto vuoto

Ecco il test di passaggio:

def test_home(self): 
    c = Client() 
    resp = c.get('/') 
    self.assertEqual(resp.status_code, 200) 
    self.assertTrue('a_formset' in resp.context) 

Ecco il test in mancanza:

def test_number_initial_number_of_forms(self): 
    c = Client() 
    resp = c.get('/') 
    self.assertEqual(resp.context['a_formset'].total_form_count(), 1) 

Nella seconda prova, ottengo l'errore TypeError: 'NoneType' object has no attribute '__getitem__'.

Se eseguo il secondo test come

def test_number_initial_number_of_forms(self): 
    c = Client() 
    resp = c.get('/') 
    self.assertTrue('a_formset' in resp.context) 
    self.assertEqual(resp.context['a_formset'].total_form_count(), 1) 

ottengo l'errore TypeError: argument of type 'NoneType' is not iterable. Ho confermato tramite dichiarazioni di stampa nel secondo test che response.content contiene la pagina che mi aspetto di ottenere, che il codice di stato è corretto e che il modello è corretto. Ma il contesto della risposta è sempre None nel secondo test.

Sto eseguendo i miei test di unità Django tramite l'interfaccia standard "python manage.py test ...", quindi non credo di trovarmi nel problema "context is empty from the shell".

Cosa sta succedendo?

Edit:

Se aggiungo print type(resp.context['a_formset']) ad ogni test, per il test di lavoro ottengo <class 'django.forms.formsets.AFormFormSet'>. Per il test non funzionante, ottengo di nuovo TypeError: 'NoneType' object has no attribute '__getitem__'.

+0

'a_form' è un formset? – sneawo

+0

@sneawo Sì, è un formset. –

+1

In entrambi i test di lavoro e non lavorativi, aggiungi temporaneamente il tipo di stampa 'linea (resp.context ['a_formset'])'. Potresti non ottenere ciò che ti aspetti. –

risposta

4

Oggi mi imbatto nello stesso problema. La seconda prova ottiene stessa pagina non ha nulla in response.context

ho fatto una ricerca e ho scoperto che 1) client di prova utilizza i segnali per popolare contesto, 2) Il mio metodo di visualizzazione non viene chiamato per la seconda prova

Ho acceso un debugger e ho scoperto che il colpevole è "middleware cache". Sapendo che ho trovato this ticket e questo SO question (quest'ultimo ha una soluzione).

Quindi, in breve: la seconda richiesta viene servita dalla cache, non da una vista, quindi una vista non viene eseguita e il client di test non riceve il segnale e non ha la possibilità di popolare il contesto.

non riesco a disabilitare la cache middleware per il mio progetto, così ho aggiunto prossimi Hack-linee nelle mie impostazioni:

if 'test' in sys.argv: 
    CACHE_MIDDLEWARE_SECONDS = 0 

Spero che questo aiuti qualcuno

5

È perché è stato eseguito in qualche errore, uscito dalla shell e riavviato.

Ma si dimenticato di iniziare ambiente ...

from django.test.utils import setup_test_environment 
>>> setup_test_environment() 

che era il mio problema. Spero funzioni...

+0

Questo ha funzionato perfettamente, grazie – intelis