【问题标题】:test for post API receiving status code 200 instead of 201测试 post API 接收状态码 200 而不是 201
【发布时间】:2019-08-01 04:57:49
【问题描述】:

我对我的 post 方法 API 的测试收到状态代码 200 但应该是 201 我试图找出问题所在,但我找不到。如果我得到错误状态 4xx 会更容易,但我不知道为什么 post 方法可以接收代码 200。我的 API 视图工作正常,所以这一定是测试代码的问题,但我真的不知道是什么可能导致这个问题.也许我错了,状态码 200 没问题,但我认为 post 方法应该收到状态 201。

test_api.py

def test_post_logged_in(self):
    product = Product.objects.get(id=1)
    self.client.login(username='test', password='test123')
    data = {
        'nick': self.user.id,
        'rate': '1/5',
        'content': 'here is comment',
        'product': product.id
    }
    response = self.client.post(reverse('add_comments', kwargs={'id': product.id}), data, format='json')
    self.assertEqual(response.status_code, 201, f'expected Response 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)

【问题讨论】:

  • 为什么不使用 ModelViewSet?
  • ModelViewSet 好很多?我最近学会了制作 API 视图,这是我目前能做的最好的。但我会检查这个 ModelViewSet。
  • 是的,您应该使用 ModelViewSet。您不必自己处理所有的 CRUD 逻辑。 DRF 已经为您做到了。在此处查看视图集文档:django-rest-framework.org/tutorial/6-viewsets-and-routers

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


【解决方案1】:

在你的post()中,如果成功则需要返回status.HTTP_201_CREATED

试试这个:

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, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

【讨论】:

  • 非常感谢,它有效,我非常讨厌这种问题,有些东西有效但不是我想要的方式,我找不到解决方案,因为没有错误......
  • @Kuracha 没问题!它发生在我们最好的人身上。我总是喜欢向后寻找最可能的罪魁祸首——在这种情况下,它是返回 Response() 的地方(我假设它默认为 200 成功)。此外,如果这对您有用,您可以按投票下的“检查”图标,它会让您将您的问题标记为已回答。这也将帮助其他人找到相同问题的正确答案。祝你好运!
猜你喜欢
  • 2020-08-22
  • 2021-06-07
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
相关资源
最近更新 更多