2013-06-15 6 views
5

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.

Antwort

7

sorry ... es scheint, es ist ein dokumentiertes Feature ...

aber es wäre schön gewesen, ein besseres Beispiel zu geben.

siehe this.

ist es in der dritten Liste Artikel:

Es ist nicht Middleware unterstützt. Sitzungs- und Authentifizierungsattribute müssen vom Test selbst geliefert werden, wenn die Ansicht für ordnungsgemäß funktioniert. jedoch

... das scheint contradictional mit den ersten Sätzen:

Die RequestFactory teilen die gleiche API wie das Test-Client. Anstatt sich wie ein Browser zu verhalten, bietet die RequestFactory eine Möglichkeit eine Anforderungsinstanz zu generieren, die als erstes Argument für eine beliebige Ansicht verwendet werden kann. Dies bedeutet, dass Sie eine View-Funktion auf die gleiche Weise testen, wie Sie eine weitere Funktion

especialy die gleiche Art und Weise

nicht sicher, ob ich sollte diese Frage entfernen .... Lösung dieses Problems prüfen würde hat mich viel Zeit ... als auch meine Abhilfe zu verstehen ...

Also nehme ich an jemand auch diese verwenden können ..

und habe ich nur noch eine Dokumentation erstreckt Anfrage: https://code.djangoproject.com/ticket/20609

+1

Dies ist nun ab 1.5 korrekt dokumentiert: https://docs.djangoproject.com/de/1.5/topics/testing/advanced/#module-django.test.client – Marcin

+1

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