2013-06-15 10 views
5

Ogni volta che uso il requestFactory durante il test come:django prova RequestFactory non include request.user

from django.contrib.auth.models import User 
from django.test import TestCase 
from django.test.client import RequestFactory 
from django.test.client import Client 
import nose.tools as nt 

class TestSomeTestCaseWithUser(TestCase): 

    def setUp(self): 
     # Every test needs access to the request factory. 
     self.factory = RequestFactory() 
     self.client = Client() 
     self.user_foo = User.objects.create_user('foo', '[email protected]', 'bar') 

    def tearDown(self): 
     # Delete those objects that are saved in setup 
     self.user_foo.delete() 

    def test_request_user(self): 
     self.client.login(username='foo', password='bar') 
     request = self.factory.post('/my/url/', {"somedata": "data"}) 
     nt.assert_equal(request.user,self.user_foo) 

su tutto ciò che cerco con request.user:

AttributeError: 'dict' object has no attribute 'user' 

questo non funzionerà, così ho aggiunto una soluzione:

def test_request_user(self): 
    # Create an instance of a GET request. 
    self.client.login(username='foo', password='bar') 
    request = self.factory.post('/my/url/', {"somedata": "data"}) 
    # a little workaround, because factory does not add the logged in user 
    request.user = self.user_foo 
    nt.assert_equal(request.user,self.user_foo) 

io uso request.user molto nel mio codice ... così anche nelle cose che voglio prova (unit) ...

Grazie a questa domanda e risposta ho scoperto che è necessario aggiungere manualmente l'utente alla richiesta: How to access request.user while testing? e l'ho aggiunto come soluzione alternativa.

Le mie domande sono:

  • Perché è questo?
  • Sembra un bug nella fabbrica della richiesta, vero? (quindi è una soluzione alternativa, o solo una funzionalità non documentata)
  • Oppure sto facendo qualcos'altro di sbagliato? (combinazione di client di test e factory)
  • Esiste un modo migliore per testare gli utenti connessi in una richiesta?

Ho provato anche questo: stesso problema

response = self.client.post("/my/url/") 
    request = response.request 

proposito, questa risposta: Accessing the request.user object when testing Django suggerisce di utilizzare

response.context['user'] 

in vece di

request.user 

Ma nel mio codice questo non è il caso, e per quanto ne so request.user è esci dal normale utilizzo, e per spiegare il mio problema, metto il request.user in un test ... nella mia vita reale, non è nei test ... è nel codice che voglio testare.

risposta

7

dispiace ... Sembra che è una caratteristica documentata ...

tuttavia, sarebbe stato bello dare un esempio migliore.

vedere this.

lì si è nel terzo elemento della lista:

Non supporta middleware. Gli attributi di sessione e autenticazione devono essere forniti dal test stesso se richiesto per la visualizzazione della funzione correttamente.

però ... questo sembrano contradictional con le prime frasi:

Il RequestFactory condivide la stessa API come il client di prova.Tuttavia, invece di comportarsi come un browser, RequestFactory fornisce un metodo per generare un'istanza di richiesta che può essere utilizzata come primo argomento in qualsiasi vista. Ciò significa che è possibile testare una funzione di visualizzazione nello stesso modo come si testare qualsiasi altra funzione

especialy stesso modo

Non sono sicuro se devo togliere questa domanda .... risolvere questo problema mi ha portato un sacco di tempo ... di capire la mia soluzione anche ...

quindi suppongo che qualcuno possa utilizzare questo come bene ..

e ho appena aggiunto una documentazione richiesta prorogando: https://code.djangoproject.com/ticket/20609

+1

Questo è ora documentato in modo appropriato dalla 1.5 in poi: https://docs.djangoproject.com/en/1.5/topics/testing/advanced/#module-django.test.client – Marcin

+1

Aggiunta di collegamenti aggiornati da questo altro per v1.5 non funziona più. https://docs.djangoproject.com/en/1.8/topics/testing/advanced/#module-django.test.client. – cjukjones

Problemi correlati