2016-02-26 13 views
6

Tôi đang sử dụng Django==1.9.2djangorestframework==3.3.2django.test.Client để thực hiện một số thử nghiệm. Vấn đề là khi tôi thực hiện các bài kiểm tra của tôi, tôi đang gettting lỗi này:Kiểm tra Django 1.9.2 Vấn đề của khách hàng

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' 

mã kiểm tra của tôi trông như thế này:

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") 

đang view của tôi là:

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 

trên số urls.py:

from rest_framework import routers 

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


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

Theo số Django doc về điều đó, tôi không cần thêm bất kỳ thứ gì để tránh CSRF checks, vì như đã nói ở đây: "Theo mặc định, ứng dụng khách sẽ vô hiệu hóa bất kỳ kiểm tra CSRF nào do trang web của bạn thực hiện." rằng enforce_csrf_checks=False theo mặc định trên Client.

Tôi đã tìm thấy một chi tiết mặc dù, nếu tôi tạo một cá thể của khách hàng theo cách đó self.client = Client(HTTP_HOST='example.com', CSRF_COOKIE='xxxxxx') thì nó hoạt động, nhưng đó có phải là thực sự cần thiết không? Nó không phải là những gì tài liệu nói, vì vậy tôi cho rằng tôi đang làm điều gì đó sai trái. Ai đó có thể giúp tôi với điều đó được không? Tôi sẽ đánh giá cao bất kỳ sự giúp đỡ nào. Cảm ơn trước

+3

DRF cung cấp cơ chế kiểm tra khác nhau, bạn có thể muốn thử những: http: //www.django-rest-framework .org/api-guide/testing/ –

+0

Cảm ơn đề xuất của bạn @TomCarrick, rất hữu ích, tôi chưa từng sử dụng nó trước đây. Tôi sẽ kiểm tra điều này, chắc chắn. Câu hỏi chính của tôi là những gì đã thay đổi từ 'Django 1.8.4' thành' Django 1.9.2' đã phá vỡ điều này? Và theo quan điểm của tôi, nó liên quan đến chính bản thân Django, cuối cùng nó là một yêu cầu như 'json' đến một điểm cuối' Django Rest Framework', nó nên có tác dụng, tôi nghĩ :(. –

Trả lời

0

Cố gắng sử dụng APITestCase DRF như lớp cơ sở đối với trường hợp kiểm tra:

from rest_framework.testing import APITestCase 

class TestMainViewSet(APITestCase): 
    ... 
Các vấn đề liên quan