我正在尝试为我的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)
答案 0 :(得分:0)
您应在api端点网址的末尾加一个斜杠。例如,应该使用response = self.client.get(f'/api/add_comments/{product.id}')
代替response = self.client.get(f'/api/add_comments/{product.id}/')
。