2016-02-26 95 views
6

我使用Django==1.9.2djangorestframework==3.3.2django.test.Client进行一些测试。问题是,当我执行我的测试,我流汗这个错误:Django 1.9.2测试客户端问题

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')然后它的工作,但是实际上需要 ?这不是文件所说的,所以我想我做错了什么。有人可以帮我吗?我将不胜感激任何帮助。 在此先感谢

+3

DRF提供不同的测试机制,你可能想尝试那些:HTTP://www.django-rest-framework .org/api-guide/testing/ –

+0

感谢您的建议@TomCarrick,非常有用,我之前没有使用它。我肯定会测试这个。我的主要问题是从“Django 1.8.4”变成了“Django 1.9.2”,这是否破坏了这个?从我的角度来看,它与'Django'本身有关,最后它是'json'到'Django Rest Framework'端点的请求,它应该已经工作了,我认为:(。再次感谢队友。 –

回答

0

尝试使用DRF的APITestCase作为基类的测试用例:

from rest_framework.testing import APITestCase 

class TestMainViewSet(APITestCase): 
    ...