Django API测试:预期状态码为200,而接收代码为301

时间:2019-03-10 18:51:50

标签: python django api unit-testing django-rest-framework

我正在尝试为我的API视图创建测试,但是我收到的状态码301表示重定向,而不是状态200和201。在第一个测试帮助中添加follow = True,但是如果我正确的话,则“跟随”强制我的网址响应,所以这毫无意义。这是我的代码:

test_api.py

from django.contrib.auth.models import User
from django.core.files.uploadedfile import SimpleUploadedFile

from rest_framework.test import APITestCase, APIClient

from ..models import Category, Product, Comment


class CreateCommentAPI(APITestCase):
    def setUp(self):
        self.client = APIClient()
        self.user = User.objects.create_user(username='test', password='test123')
        self.user.save()

    @classmethod
    def setUpTestData(cls):
        Category.objects.create(name='PC', slug='pc')
        Product.objects.create(
            category=Category.objects.get(id=1),
            name='Laptop', slug='laptop',
            description='here is description',
            photo=SimpleUploadedFile("file.jpeg", b"file_content", content_type="image/jpeg"),
            price=1999, available='available'
        )

    def test_logged_in_access_to_view(self):
        product = Product.objects.get(id=1)
        login = self.client.login(username='test', password='test123')
        response = self.client.get(f'/api/add_comments/{product.id}')
        self.assertTrue(login)
        self.assertEqual(response.status_code, 200, f'expected Response code 200, instead get {response.status_code}')

    def test_post_logged_in(self):
        product = Product.objects.get(id=1)
        self.client.login(username='test', password='test123')
        comment = {
            'nick': self.user.id,
            'rate': '1/5',
            'content': 'here is comment',
            'product': product.id
        }
        response = self.client.post(f'/api/add_comments/{product.id}/', comment, format='json')
        self.assertEqual(response.data, comment)
        self.assertEqual(response.status_code, 201, f'expected status code 201, instead get{response.status_code}')

views.py

class CreateComment(APIView):

    def get_object(self, id):
        try:
            return Product.objects.get(id=id)
        except Product.DoesNotExist:
            raise Http404

    def get(self,request,  id):
        product = self.get_object(id)
        serializer = ProductSerializer(product)
        return Response(serializer.data)

    def post(self, request,id):
        serializer = CommentSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(nick=request.user, product=self.get_object(id))
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

1 个答案:

答案 0 :(得分:0)

您应在api端点网址的末尾加一个斜杠。例如,应该使用response = self.client.get(f'/api/add_comments/{product.id}')代替response = self.client.get(f'/api/add_comments/{product.id}/')

相关问题