Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django API测试:预期状态代码为200,而不是301_Python_Django_Api_Unit Testing_Django Rest Framework - Fatal编程技术网

Python Django API测试:预期状态代码为200,而不是301

Python Django API测试:预期状态代码为200,而不是301,python,django,api,unit-testing,django-rest-framework,Python,Django,Api,Unit Testing,Django Rest Framework,我试图为我的API视图创建测试,但我收到的状态代码是301,这意味着重定向状态是200和201。在第一个测试帮助中,添加follow=True,但如果我的“follow”是正确的,那么就强制我的url响应,这样做是没有意义的。这是我的代码: 测试api.py from django.contrib.auth.models import User from django.core.files.uploadedfile import SimpleUploadedFile from rest_fra

我试图为我的API视图创建测试,但我收到的状态代码是301,这意味着重定向状态是200和201。在第一个测试帮助中,添加follow=True,但如果我的“follow”是正确的,那么就强制我的url响应,这样做是没有意义的。这是我的代码:

测试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)

您应该在api端点url的末尾放一个斜杠。例如,您应该使用
response=self.client.get(f'/api/add_comments/{product.id}')
而不是
response=self.client.get(f'/api/add_comments/{product.id}/)

您的api设计:为什么获取
/add_comments/
视图会返回对象的表示?我不确定您的意思,/api/add_comments/{product.id}只是指向我的api视图的url,在第一次测试中,我希望返回我的视图,而不是任何对象。我正在学习为API编写测试,我正在做类似于我的标准Django views测试的工作,其中该测试结构运行良好。好的,我发现我忘了在url末尾添加“/”。是的,如果是这样,你应该使用
resolve\u url()
reverse()
(就像你在视图中所做的那样)生成URL而不是在测试中硬编码。你永远不会从任何东西返回201。。。