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
DRF verschiedene Prüfmechanismen bietet, können Sie diejenigen versuchen wollen .org/api-guide/testing/ –
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. –