Я использую Django==1.9.2
и djangorestframework==3.3.2
и django.test.Client
, чтобы сделать некоторые тесты. Проблема заключается в том, что когда я исполню моих тестов я gettting эту ошибку:Django 1.9.2 test Выдача клиента
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'
Мой тестовый код выглядит следующим образом:
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")
view
мой код:
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
на urls.py
:
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'books', MainViewSet, 'books')
urlpatterns = [
url(r'^api/', include(router.urls)),
]
В связи с этим Django doc об этом, мне не нужно ничего лишнего, чтобы избежать CSRF checks
, , потому что текстовое сообщение там: «По умолчанию тестовый клиент отключит любые проверки CSRF, выполняемые вашим сайтом». Я также знаю что enforce_csrf_checks=False
по умолчанию на Client
.
Я нашел одну деталь, хотя, если я создаю экземпляр клиента таким образом self.client = Client(HTTP_HOST='example.com', CSRF_COOKIE='xxxxxx')
, тогда он работает, но это то, что действительно нужен? Это не то, что говорит документация, поэтому я полагаю, что я делаю что-то неправильно. Может ли кто-нибудь помочь мне в этом, пожалуйста? Я буду признателен за любую помощь. Заранее спасибо
ФПИ предоставляет различные механизмы тестирования, которые вы можете попробовать эти: HTTP: //www.django-rest-framework .org/api-guide/testing/ –
Спасибо за ваше предложение @TomCarrick, очень полезно, я не использовал его раньше. Я обязательно проверю это. Мой главный вопрос: что изменилось с 'Django 1.8.4' на' Django 1.9.2', что сломало это? И, с моей точки зрения, это связано с самим «Django», в конце это запрос как «json» в «конечную точку Django Rest Framework», он должен был работать, я думаю :(Спасибо за помощь. –