2014-04-15 12 views
16

Ich habe Probleme Testen eines Viewset:Django Rest Framework - Wie ViewSet zu testen?

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) 

Ich versuche, die Syntax hier zu replizieren:

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

Aber ich denke, ihre AccountDetail Blick aus meinem Viewset verschieden ist, so Ich erhalte diesen Fehler von der letzten Zeile:

Gibt es hier eine korrekte Syntax oder bin ich vermischen Co Nzepten? Meine APIClient-Tests funktionieren, aber ich verwende die Factory hier, weil ich irgendwann "request.user = some_user" hinzufügen möchte. Danke im Voraus!

Oh und der Client-Test funktioniert:

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

Antwort

3

Ich denke, es ist Ihre letzte Zeile. Sie müssen das CatViewSet als_view() aufrufen. Ich würde mit:

response = view(request) 

gegeben, dass Sie bereits view = CatViewSet.as_view()

EDIT definiert:

Können Sie zeigen Ihre views.py? Genauer gesagt, welche Art von ViewSet hast du benutzt? Ich drehe den DRF-Code durch und es sieht so aus, als ob Ihrem ViewSet keine Aktionen zugeordnet sind, die den Fehler auslösen.

+0

leid, dass ich letzte Zeile falsch, ich bearbeiten zu beheben diesen Fehler – WBC

+0

, welche Zeile in der kopierte Code wirft den Fehler? – Alex

+0

letzte Zeile, ich bin in der Lage, auf den Debugger vor es zu gehen, alles ist definiert, aber ich denke, es gibt etwas Besonderes über die Übergabe von Anfrage in ViewSet? – WBC

12

Ich glaube, ich die richtige Syntax gefunden, aber nicht sicher, ob es üblich (noch neu in Django) ist:

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) 

So, jetzt dies passiert und ich kann request.user zuweisen, die mir erlaubt, anpassen die Abrufmethode unter CatViewSet, um den Benutzer zu berücksichtigen.

7

Ich hatte das gleiche Problem, und war in der Lage, eine Lösung zu finden.

Mit Blick auf den Quellcode sieht es so aus, als ob die Ansicht erwartet, dass es ein Argument "Aktionen" gibt, das eine Methode Elemente (also ein Diktat) hat. Diese

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

ist, wo der Fehler Sie bekommen herkommt. Sie müssen die Argumentaktionen mit einem dict angeben, das die zulässigen Aktionen für diesen Viewset enthält, und dann können Sie das Viewset ordnungsgemäß testen.

Die allgemeine Zuordnung geht:

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

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

In Ihrem Fall Sie werden { 'get': 'abrufen'} Wie so:

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: Sie müssen tatsächlich die erforderlichen Aktionen angeben. Code und Kommentare wurden entsprechend geändert.

3

ich einen Weg, um dies manuell, ohne dass zu tun, das Richtige gefunden Viewset erstellen und eine Aktion Mapping geben:

from django.core.urlresolvers import reverse, resolve 
... 
url = reverse('cat-list') 
req = factory.get(url) 
view = resolve(url).func 
response = view(req) 
response.render() 
Verwandte Themen