2015-02-09 18 views
6

phép nói rằng tôi có APIView nàyDjango Nghỉ ngơi Khung yêu cầu APIRequestFactory đối tượng không có thuộc tính 'query_params'

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

Để kiểm tra nó, tôi cần phải tạo ra một đối tượng yêu cầu để vượt qua vào get chức năng

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

Khiếu nại về AttributeError: 'WSGIRequest' object has no attribute 'query_params'

Có giao diện gần hơn, nhà máy tạo ra phiên bản WSGIRequest thay vì phiên bản DRF <class 'rest_framework.request.Request'>.

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

Trả lời

10

Đúng vậy. Tại thời điểm APIRequestFactory trả về đối tượng HttpRequest, chỉ được nâng cấp lên đối tượng REST Request đối tượng khi nó được đưa vào lớp chế độ xem.

Điều này phản ánh hành vi mà bạn sẽ thấy trong yêu cầu thực tế và những gì nó thực hiện làm là xử lý ví dụ: hiển thị JSON, XML hoặc bất kỳ loại nội dung nào khác mà bạn đã định cấu hình cho các yêu cầu thử nghiệm của mình.

Tuy nhiên tôi đồng ý rằng đó là hành vi đáng ngạc nhiên và tại một số điểm thì có lẽ nó sẽ trả về một đối tượng Request, và xem khuôn khổ REST sẽ đảm bảo rằng nó chỉ thực hiện việc nâng cấp Request trên yêu cầu mà trường hợp của HttpRequest.

Những gì bạn cần làm trong trường hợp của bạn là thực cuộc gọi quan điểm, chứ không phải là cách gọi phương pháp .get() ...

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

đối với tôi: Tôi đã sử dụng bộ nối tiếp bên trong chế độ xem dựa trên lớp django và có ngoại lệ được đề cập ở trên. reasion: yêu cầu không phải drf đã được gửi đến bối cảnh serializer/ – patroqueeet

12

Tham khảo giải pháp của Tom, DummyView()(request) sẽ tăng lỗi:

TypeError: 'DummyView' object is not callable 
Thay vào đó, hãy sử dụng giống như những gì bạn làm trong
DummyView.as_view()(request) 

DRF's as_view sử dụng method initialize_request để chuyển đổi Django Yêu cầu đối tượng sang phiên bản DRF. Bạn có thể thử với:

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

Bạn cũng có thể sử dụng APIClient để chạy thử nghiệm. Nó cũng kiểm tra việc gửi URL.

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

Thật vậy, tôi là ngu ngốc - cập nhật câu trả lời của tôi ngay bây giờ, cảm ơn! –

+7

Trong khi tôi chấp nhận câu trả lời của Tom vì nó trả lời trực tiếp câu hỏi của tôi ở đây, gợi ý 'initialize_request' thực sự giúp ích rất nhiều. –

Các vấn đề liên quan