Python Django API测试:预期状态代码为200,而不是301
我试图为我的API视图创建测试,但我收到的状态代码是301,这意味着重定向状态是200和201。在第一个测试帮助中,添加follow=True,但如果我的“follow”是正确的,那么就强制我的url响应,这样做是没有意义的。这是我的代码: 测试api.pyPython 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
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。。。