2015-02-09 16 views
6

Können sagen, ich habe diese APIViewDjango Rastrahmen APIRequestFactory Request-Objekt hat kein Attribut ‚query_params‘

class Dummy(APIView): 
    def get(self, request): 
     return Response(data=request.query_params.get('uuid')) 

es zu testen, ich brauche ein Request-Objekt zu erstellen, in der get Funktion zu übergeben

def test_dummy(self): 
    from rest_framework.test import APIRequestFactory 
    factory = APIRequestFactory() 
    request = factory.get('/?uuid=abcd') 
    DummyView().get(request) 

Es beschwert sich über AttributeError: 'WSGIRequest' object has no attribute 'query_params'

einen genaueren Blick zu haben, schafft das Werk eine WSGIRequest Instanz anstelle einer DRF-Version <class 'rest_framework.request.Request'>.

>>> from rest_framework.test import APIRequestFactory 
>>> factory = APIRequestFactory() 
>>> request = factory.get('/') 
>>> request.__class__ 
<class 'django.core.handlers.wsgi.WSGIRequest'> 

Antwort

10

Das stimmt. Im Moment gibt APIRequestFactory ein Objekt HttpRequest zurück, das nur dann auf ein REST-Framework aktualisiert wird, wenn es in den View-Layer gelangt.

Dies spiegelt das Verhalten wider, das Sie in einer tatsächlichen Anfrage sehen werden, und was es tut, ist do ist mit z. Rendern von JSON, XML oder einem anderen Inhaltstyp, den Sie für Ihre Testanforderungen konfiguriert haben.

Allerdings stimme ich, dass es überraschendes Verhalten und irgendwann wird es wahrscheinlich ein Request Objekt zurück, und die Rahmen Ansicht REST wird sichergestellt, dass es nur das Request Upgrade auf Anfragen, die Instanzen von HttpRequest ausführt.

Was müssen Sie in Ihrem Fall zu tun ist, tatsächlich Aufruf der Ansicht, anstatt die .get() Methode aufgerufen ...

factory = APIRequestFactory() 
request = factory.get('/?uuid=abcd') 
view = DummyView.as_view() 
response = view(request) # Calling the view, not calling `.get()` 
+0

für mich: Ich benutzte einen Serializer innerhalb einer Django-basierten Ansicht und bekam die oben erwähnte Ausnahme. reasion: non-drf Anfrage wurde an den Serializer-Kontext gesendet/ – patroqueeet

12

Tom Lösung finden, wird DummyView()(request) Fehler aus:

TypeError: 'DummyView' object is not callable 

Stattdessen sollte as_view genau wie das, was Sie in urls.py tun:

DummyView.as_view()(request) 

DRF as_view verwendet method initialize_request, um Django Request-Objekt in DRF-Version zu konvertieren. Sie können versuchen, mit:

from rest_framework.views import APIView 
APIView().initialize_request(request) 
>>> <rest_framework.request.Request object at 0xad9850c> 

Sie auch APIClient Test ausführen können. Es testet auch die URL-Verteilung.

from rest_framework.test import APIClient 
client = APIClient() 
client.post('/notes/', {'title': 'new idea'}, format='json') 
+0

Ja, ich bin dumm - aktualisierte meine Antwort jetzt, danke! –

+7

Während ich Toms Antwort akzeptierte, da sie meine Frage hier direkt beantwortet, hilft der 'initialize_request' Hinweis tatsächlich sehr. –

Verwandte Themen