Jedes Mal, wenn ich die requestFactory verwenden während der Tests wie:django Test RequestFactory nicht enthalten 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)
auf alles versuche ich mit request.user:
AttributeError: 'dict' object has no attribute 'user'
das wird nicht funktionieren, so habe ich eine Abhilfe:
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)
ich request.user viel in meinem Code verwenden ... so auch in dem, was ich will (Einheit) Test ...
Dank dieser Frage und Antwort habe ich herausgefunden, dass Sie den Benutzer manuell zur Anfrage hinzufügen müssen: How to access request.user while testing? und ich habe dies als Workaround hinzugefügt.
Meine Fragen sind:
- Warum ist das?
- Es fühlt sich an wie ein Fehler in der Anfrage-Fabrik, oder? (So ist es ein Workaround oder nur ein undokumentiertes Feature)
- Oder mache ich etwas anderes falsch? (Kombination aus Test-Client und Fabrik)
- Gibt es eine bessere Möglichkeit, mit angemeldeten Benutzern in einer Anfrage zu testen?
ich schon versucht, diese auch: gleiches Problem
response = self.client.post("/my/url/")
request = response.request
By the way, diese Antwort mit: Accessing the request.user object when testing Django schlägt
response.context['user']
anstelle von
request.user
zu verwenden, aber In meinem Code ist dies nicht der Fall, und soweit ich weiß, ist request.user quit normal zu verwenden, und um mein Problem zu erklären, stelle ich den request.user in einen Test ... in meinem echten Leben ist es nicht in den Tests ... es ist in dem Code, den ich testen möchte.
Dies ist nun ab 1.5 korrekt dokumentiert: https://docs.djangoproject.com/de/1.5/topics/testing/advanced/#module-django.test.client – Marcin
Hinzufügen eines aktualisierten Links seit diesem anderen v1.5 funktioniert nicht mehr. https://docs.djangoproject.com/en/1.8/topics/testing/advanced/#module-django.test.client. – cjukjones