【问题标题】:Django Rest - testing api deleteDjango Rest - 测试 api 删除
【发布时间】:2020-10-30 10:48:33
【问题描述】:

目前我正在测试我的 django rest api,但我坚持使用删除方法。

我的网址是这样的

  path('books/shelfs/<int:shelf>/readers/<int:pk>/',
    views.ReaderViewSet.as_view(
        {'get': 'retrieve', 'delete': 'destroy', 'patch': 'partial_update'}),

我的 ViewSet 看起来像这样

  def destroy(self, request, pk=None, *args, **kwargs):
    if request.data.get("book_type") is None:
        raise ParseError(detail="book_type is required, options are : 'global, non-global'")
    try:
        instance = self.get_object()
        user = self.request.user
        serializer = self.get_serializer(self.get_object())
        .......
        self.perform_destroy(instance)
    except Http404:
        pass
    return Response(status=status.HTTP_204_NO_CONTENT)

 

我的测试用例是这样的

   def test_book_delete(self):
   
    # check if delete works
    book_type = {'book_type': 'global'}

    response = self.client.delete("/api/v1/books/shelfs/{}/"
                                  "readers/{}/".format(
                                      1, 2), data=book_type)
    self.assertEqual(response.status_code, 204)

但总是415错误

问题是,如何在 delete 中传递这个book_type

【问题讨论】:

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


    【解决方案1】:

    HTTP 415 表示服务器拒绝接受 JSON 负载。

    Docs:

    如果您需要对请求正文进行显式编码,可以通过设置 content_type 标志来实现。

    所以尝试如下设置content_type

    response = self.client.delete("/api/v1/books/shelfs/{}/"
                                      "readers/{}/".format(
                                          1, 2), data=book_type, content_type="application/json")
    

    【讨论】:

    • 好的 - 所以/api/v1/books/shelfs/1/readers/2/没有要删除的资源
    • 它确实存在。它工作得很好,但我需要在请求中添加自定义数据以进行一些检查,这就是为什么我需要在请求正文中添加一些数据,没有那些额外的要求它就可以工作,所以也许 Django Rest 不是为了在删除方法中添加正文而设计的,我我不确定是否需要阅读文档
    • 我在chat - 如果可以的话会有所帮助
    • 所以我已经知道错误的确切来源。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2014-07-14
    • 2018-07-04
    • 2017-12-16
    • 2022-07-26
    • 2014-10-16
    相关资源
    最近更新 更多