2014-04-15 24 views
16

Tôi đang gặp rắc rối thử nghiệm một ViewSet:Django Rest Framework - Làm thế nào để kiểm tra ViewSet?

class ViewSetTest(TestCase): 
    def test_view_set(self): 
     factory = APIRequestFactory() 
     view = CatViewSet.as_view() 
     cat = Cat(name="bob") 
     cat.save() 

     request = factory.get(reverse('cat-detail', args=(cat.pk,))) 
     response = view(request) 

Tôi đang cố gắng để tái tạo cú pháp ở đây:

http://www.django-rest-framework.org/api-guide/testing#forcing-authentication

Nhưng tôi nghĩ xem AccountDetail của họ là khác nhau từ ViewSet tôi, vì vậy Tôi nhận được lỗi này từ dòng cuối cùng:

AttributeError: 'NoneType' object has no attributes 'items' 

Có cú pháp chính xác ở đây hay tôi trộn lên co các khái niệm? Bài kiểm tra APIClient của tôi hoạt động, nhưng tôi đang sử dụng nhà máy ở đây vì cuối cùng tôi muốn thêm "request.user = some_user". Cảm ơn trước!

Oh và kiểm tra khách hàng hoạt động tốt:

def test_client_view(self): 
    response = APIClient().get(reverse('cat-detail', args=(cat.pk,))) 
    self.assertEqual(response.status_code, 200) 

Trả lời

3

Tôi nghĩ đó là dòng cuối cùng của bạn. Bạn cần gọi hàm CatViewSet as_view(). Tôi sẽ đi với:

response = view(request) 

cho rằng bạn đã được xác định view = CatViewSet.as_view()

EDIT:

Bạn có thể hiển thị views.py của bạn? Cụ thể, bạn đã sử dụng loại ViewSet nào? Tôi đang đào thông qua mã DRF và có vẻ như bạn không thể có bất kỳ hành động nào được ánh xạ tới ViewSet của bạn, điều này gây ra lỗi.

+0

xin lỗi tôi sao chép dòng cuối cùng sai, tôi chỉnh sửa để khắc phục điều đó sai lầm – WBC

+0

Những dòng trong mã đang ném lỗi? – Alex

+0

dòng cuối cùng, tôi có thể đi đến trình gỡ rối trước khi nó, tất cả mọi thứ được xác định nhưng tôi nghĩ rằng có lẽ có một cái gì đó đặc biệt về việc chuyển yêu cầu vào ViewSet? – WBC

12

Tôi nghĩ rằng tôi thấy cú pháp chính xác, nhưng không chắc chắn nếu nó là thông thường (vẫn còn mới để Django):

def test_view_set(self): 
    request = APIRequestFactory().get("") 
    cat_detail = CatViewSet.as_view({'get': 'retrieve'}) 
    cat = Cat.objects.create(name="bob") 
    response = cat_detail(request, pk=cat.pk) 
    self.assertEqual(response.status_code, 200) 

Vì vậy, bây giờ điều này đi và tôi có thể gán request.user, cho phép tôi để tùy chỉnh phương thức truy xuất trong CatViewSet để xem xét người dùng.

7

Tôi gặp vấn đề tương tự và có thể tìm được giải pháp.

Nhìn vào mã nguồn, có vẻ như khung nhìn dự kiến ​​sẽ có một đối số 'hành động' có một mục phương thức (như vậy, một dict).

https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/viewsets.py#L69

Đây là nơi các lỗi mà bạn đang nhận được là đến từ. Bạn sẽ phải chỉ định các hành động đối số với một dict chứa các hành động được phép cho viewset đó, và sau đó bạn sẽ có thể kiểm tra viewset đúng cách.

Việc lập bản đồ nói chung đi:

{ 
    'get': 'retrieve', 
    'put': 'update', 
    'patch': 'partial_update', 
    'delete': 'destroy' 
} 

http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers

Trong trường hợp của bạn, bạn sẽ muốn { 'get': 'lấy'} Giống như vậy:

class ViewSetTest(TestCase): 
    def test_view_set(self): 
     factory = APIRequestFactory() 
     view = CatViewSet.as_view(actions={'get': 'retrieve'}) # <-- Changed line 
     cat = Cat(name="bob") 
     cat.save() 

     request = factory.get(reverse('cat-detail', args=(cat.pk,))) 
     response = view(request) 

EDIT: Bạn thực sự cần phải chỉ định các hành động được yêu cầu. Đã thay đổi mã và nhận xét để phản ánh điều này.

3

Tôi tìm thấy một cách để làm điều này mà không cần phải tự tạo các viewset phải và cung cấp cho nó một bản đồ hành động:

from django.core.urlresolvers import reverse, resolve 
... 
url = reverse('cat-list') 
req = factory.get(url) 
view = resolve(url).func 
response = view(req) 
response.render() 
Các vấn đề liên quan