2012-04-13 11 views
7

Ho una funzione che chiamo da un unittest. Dall'impostazione di alcune tracce di debug, so che la funzione ha funzionato come un incantesimo e ha tutti i valori correttamente preparati per il ritorno.Posso accedere al contesto di risposta di una vista testata senza il client di prova?

Questo è ciò che il mio testcode assomiglia (vedere dove la mia ipdb.set_trace() è):

@override_settings(REGISTRATION_OPEN=True) 
def test_confirm_account(self): 
    """ view that let's a user confirm account creation and username 
     when loggin in with social_auth """  
    request = self.factory.get('') 
    request.user = AnonymousUser() 
    request.session={} 
    request.session.update({self.pipename:{'backend':'facebook', 
              'kwargs':{'username':'Chuck Norris','response':{'id':1}}}}) 

    # this is the function of which i need the context: 
    response = confirm_account(request) 
    self.assertEqual(response.context['keytotest'],'valuetotest') 

Da quello che so da this part of the Django docs, sarei in grado di accedere response.context quando ho usato il client di test. Ma quando provo ad accedere response.context come ho fatto, ottengo questo:

AttributeError: 'HttpResponse' object has no attribute 'context'

C'è un modo per ottenere l'oggetto HttpResponse speciale del cliente, senza utilizzare il client?

risposta

-3

contesto (sic!) Può essere trovato nella classe di risposta. Come vedi, è HTTP Risposta che si ottiene dalla funzione di visualizzazione. Questo è successo perché lo hai chiamato direttamente. Chiama questa funzione tramite client di test e andrà bene.

response = client.get('/fobarbaz/') 
response.context 
+0

Chiamarlo tramite il client di test non mi dà il pieno controllo sulla composizione della richiesta. Ho chiesto esplicitamente se è possibile senza il client. – marue

+0

Sto manipolando la sessione usando il client integrato nei miei test (guarda client.session). È quello che chiami controllo di contruction di richiesta? Se è così, riconsidera il tuo downvote. – starenka

+2

No, non lo è. Una sessione è informazioni su un determinato utente memorizzato sul lato server, la richiesta è ciò che un client invia al server per richiedere una risposta del server. Il contesto di risposta (che stavo chiedendo) viene utilizzato solo per i test e contiene informazioni su come il server ha creato la risposta (ad esempio quali modelli sono stati utilizzati). Non è uguale al contesto della richiesta e non è uguale alla sessione. – marue

8

Il RequestFactory non tocca il middleware Django, e come tale, non genererà un contesto (vale a dire senza ContextManager middleware).

Se si desidera verificare il contesto, è necessario utilizzare il client di prova. È ancora possibile manipolare la costruzione della richiesta del client di prova sia utilizzando finto o semplicemente salvare la sessione prima del tempo nel test, come ad esempio:

from django.test import Client 
c = Client() 
session = c.session 
session['backend'] = 'facebook' 
session['kwargs'] = {'username':'Chuck Norris','response':{'id':1}} 
session.save() 

Ora, quando si carica la vista con il client di prova , si utilizzerà la sessione man mano che viene impostata e quando si utilizza response = c.get('/yourURL/'), è possibile fare riferimento al contesto della risposta utilizzando response.context come desiderato.

1

Anche se questo è un vecchio post, suppongo che questo suggerimento possa essere d'aiuto. È possibile esaminare utilizzando TemplateResponse (o SimpleTemplateResponse) che può essere sostituito per render o render_to_response.

Il Django docs ha più su questo

0

Sì, è possibile. Devi patchare il rendering.

sto usando pytest-django

class Test: 
    def context(self, call_args): 
     args, kwargs = call_args 
     request_mock, template, context = args 
     return context 

    @patch('myapplication.views.render') 
    def test_(self, mock_render, rf): 
     request = rf.get('fake-url') 
     view(request) 
     context = self.context(mock_render.call_args) 

     keytotest = 'crch' 
     assert keytotest == context['keytotest'] 
0

Il "response.context" non è corretto ma è possibile utilizzare response.context_data per ottenere lo stesso contesto che passava a TemplateResponse.

+0

Sei downvoted, ma questo è corretto.'response.context' è un oggetto' ContextList' mentre 'response.context_data' è un dizionario strutturato come l'istanza' Context' passata al template. –

Problemi correlati