2016-02-26 9 views
6

Ich verwende Django==1.9.2 und djangorestframework==3.3.2, und django.test.Client, um einige Tests zu machen. Das Problem ist, dass, wenn ich meine Tests ausführen ich diesen Fehler bin gettting:Django 1.9.2 Test Client-Problem

ERROR: test_view (main.tests.test_http.TestMainViewSet) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/vladir/work/all/project-django1.9/saxo-publish/publish/main/tests/test_http.py", line 111, in test_view 
    content_type='application/json' 
    File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/test/client.py", line 515, in post 
    secure=secure, **extra) 
    File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/test/client.py", line 314, in post 
    secure=secure, **extra) 
    File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/test/client.py", line 380, in generic 
    return self.request(**r) 
    File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/test/client.py", line 449, in request 
    response = self.handler(environ) 
    File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/test/client.py", line 123, in __call__ 
    response = self.get_response(request) 
    File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 245, in get_response 
    response = self.handle_uncaught_exception(request, resolver, sys.exc_info()) 
    File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 296, in handle_uncaught_exception 
    return callback(request, **param_dict) 
    File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/utils/decorators.py", line 166, in _wrapped_view 
    return middleware.process_response(request, response) 
    File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/middleware/csrf.py", line 230, in process_response 
    request.META["CSRF_COOKIE"], 
KeyError: u'CSRF_COOKIE' 

Mein Test-Code sieht wie folgt aus:

import json 

from django.test import Client 
from django.core.urlresolvers import reverse 
from django.contrib.auth.models import User 


class TestMainViewSet(TestCase): 

    def setUp(self): 
     self.client = Client(
      HTTP_HOST='example.com' # I have also tried removing this 
     ) 
     self.create_read_url = reverse('books-list') 
     User.objects.create_user(
      username="username", 
      email="[email protected]", 
      password="123" 
     ) 

    def test_create(self): 
     self.client.login(username='username', password="123") 
     # In this case I'm doing a POST, but it is the same with a GET 
     response = self.client.post(
      self.create_read_url, 
      data=json.dumps({'title': "Create"}), # I have also tried without the json.dumps 
      content_type='application/json' 
     ) 

     data = json.loads(response.content) 
     print data 

     self.assertEqual(response.status_code, 201) 
     self.assertEquals(data['title'], "Create") 

mein view Code ist:

from django.contrib.auth.mixins import LoginRequiredMixin 

from rest_framework import viewsets 

from .serialiazers import (
    BookSerializerRead, 
    BookSerializerWrite, 
) 

class MainViewSet(LoginRequiredMixin, viewsets.ModelViewSet): 
    queryset = Book.objects.all() 
    serializer_class_read = BookSerializerRead 
    serializer_class_write = BookSerializerWrite 

auf die urls.py:

from rest_framework import routers 

router = routers.DefaultRouter() 
router.register(r'books', MainViewSet, 'books') 


urlpatterns = [ 
    url(r'^api/', include(router.urls)), 
] 

Nach der Django doc darüber, ich sollte nichts zusätzlich zu vermeiden, um die CSRF checks, zu vermeiden, denn wie gesagt dort: "Standardmäßig deaktiviert der Test-Client alle CSRF-Prüfungen von Ihrer Website durchgeführt.", Und ich weiß auch dass enforce_csrf_checks=False standardmäßig auf der Client.

Ich habe jedoch ein Detail gefunden, wenn ich eine Instanz des Clients auf diese Weise erstellen self.client = Client(HTTP_HOST='example.com', CSRF_COOKIE='xxxxxx') dann funktioniert es, aber ist das tatsächlich benötigt? Es ist nicht, was die Dokumentation sagt, also nehme ich an, dass ich etwas falsch mache. Könnte mir bitte jemand damit helfen? Ich werde jede Hilfe über schätzen. Vielen Dank im Voraus

+3

DRF verschiedene Prüfmechanismen bietet, können Sie diejenigen versuchen wollen .org/api-guide/testing/ –

+0

Danke für deinen Vorschlag @TomCarrick, sehr nützlich, ich habe es vorher nicht benutzt. Ich werde das sicher testen. Meine Hauptfrage ist, was sich von 'Django 1.8.4' zu' Django 1.9.2' geändert hat, was das kaputt gemacht hat? Und aus meiner Sicht ist es etwas, das mit 'Django' selbst zusammenhängt, am Ende ist es eine Anfrage als' Json' zu einem 'Django Rest Framework' Endpunkt, es hätte funktionieren sollen, denke ich :(. Danke nochmal Kumpel. –

Antwort

0

Try DRF APITestCase als Basisklasse für Testfälle zu verwenden: http: //www.django-rest-framework

from rest_framework.testing import APITestCase 

class TestMainViewSet(APITestCase): 
    ...