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.
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
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