2015-02-09 30 views
6

Django istirahat Çerçeve APIRequestFactory isteği nesne vardır hiçbir özellik 'query_params'

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

test için, ben get işlevi

def test_dummy(self): 
    from rest_framework.test import APIRequestFactory 
    factory = APIRequestFactory() 
    request = factory.get('/?uuid=abcd') 
    DummyView().get(request) 
geçmesine bir istek nesnesi oluşturmak gerekir bu APIView kullandığınızı varsayalım

yaklaşık AttributeError: 'WSGIRequest' object has no attribute 'query_params'

yakından olması, fabrika bir DRF sürümüyerine WSGIRequest örneğini oluşturur şikayet.

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

cevap

10

Doğru. Şu anda APIRequestFactory, HttpRequest nesnesini döndürür, yalnızca görüntüleme katmanına ulaştığında REST çerçevesi Request nesnesine yükseltilir.

Bu, gerçek bir istekte göreceğiniz davranışı yansıtır ve 'un yapmasına neden olur. test talepleriniz için yapılandırdığınız JSON, XML veya başka bir içerik türünü oluşturma.

Ancak şaşırtıcı davranış olduğunu kabul edip bir noktada muhtemelen Request nesneyi döndürür ve DİNLENME çerçeve görünümü sadece istekleri HttpRequest örneklerinin üzerinde Request yükseltme gerçekleştirir sağlayacaktır.

TypeError: 'DummyView' object is not callable 
:

Ne senin durumda yapmanız gereken

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

benim için: django sınıfı tabanlı bir görünüm içinde bir seri hale getirici kullandım ve yukarıda belirtilen istisnayı aldım. reasion: drf olmayan istek seri hale getirici içeriğine gönderildi/ – patroqueeet

12

Tom'un çözüme bakın

, DummyView()(request) hata neden ... ziyade .get() yöntemi çağrılırken daha aslında çağrı görünümüdür

Bunun yerine, urls.py:

'te yaptığınız gibi as_view'u kullanmalısınız.
DummyView.as_view()(request) 

DRF as_view, Django Request nesnesini DRF sürümüne dönüştürmek için method initialize_request kullanır. Ayrıca testi çalıştırmak için APIClient kullanabilirsiniz

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

: ile Deneyebilirsin. Ayrıca URL gönderimini de test eder.

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

Gerçekten de, aptal olmak - şimdi cevabımı güncelledim, teşekkürler! –

+7

Tom'un cevabını, buradaki soruyu doğrudan yanıtladığından kabul etmeme rağmen, 'initialize_request 'ipucu aslında çok yardımcı oluyor. –

İlgili konular