【问题标题】:django Testing views works only with a primary keydjango 测试视图仅适用于主键
【发布时间】:2021-06-23 01:42:49
【问题描述】:

我正在做一个 django 项目。我已经构建了前端和后端。现在我想写单元测试。

我想测试一个基于类的视图,用于从 url '''path('posts/', Postview.as_view(),name="posts"),''' 创建、删除和检索博客文章 我的 Postview 视图在这里:

class Postview(views.APIView, LimitOffsetPagination):
    authentication_classes = [TokenAuthentication, ]
    permission_classes = [IsAuthenticated, ]

    def get(self, request, pk=None):
        if pk:
            try:
                query = Post.objects.filter(pk=pk)
                # print(query)
                print("in post get")
                serializer = PostSerializer(
                    query, many=True, context={'request': request})
                data = commonPost(serializer.data, request)
                return Response(data)
            except:
                return Response({"message": "No Data found"})
        else:
            query = Post.objects.all().order_by('-id')
            serializer = PostSerializer(
                query, many=True, context={'request': request})
            data = commonPost(serializer.data, request)
            return Response(data)

    def post(self, request, pk=None):
        if pk:
            snapshot = Post.objects.get(pk=pk)
            serializers = PostSerializer(
                snapshot, data=request.data, context={'request': request})
            if serializers.is_valid():
                serializers.save()
                return Response({'error': False})
            return Response({'error': True})
        else:
            serializer = PostSerializer(
                data=request.data, context={'request': request})
            if serializer.is_valid():
                serializer.save()
                return Response({'error': False})
            return Response({'error': True})

    def delete(self, request, pk):
        try:
            snippet = Post.objects.get(pk=pk)
            if snippet.profile.id == request.user.profile.id:
                snippet.delete()
                return Response({"error": False})
            else:
                return Response({"error": True})
        except:
            return Response({"message": "No data found for this ID"})

现在我的单元测试

def test_post_view(self):
        client=self.get_client()
        response=client.get("/api/posts/")# this line
        self.assertEqual(response.status_code,200)

这个测试给出的错误是 401!=200 但是如果我更改网址 到

response=client.get("/api/posts/1")

测试给出 200_k。 如果我通过client.post("/api/posts/",self.post) #here the post object created through Post model of my Custom Post class. 创建一个新帖子 响应返回 401!=200。 我想知道它为什么会这样,我想知道如何为这段代码创建单元测试。 谢谢。

【问题讨论】:

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


    【解决方案1】:
    1. 所以你写了POST 方法有问题,但是
    def test_post_view(self):
            client=self.get_client()
            response=client.get("/api/posts/")# this line
            self.assertEqual(response.status_code,200)
    

    这里你使用GET 方法。

    1. POST 不接受任何 pk,因为它创建了一个新资源。 所以这是无效的。
    client.post("/api/posts/",self.post)
    
    1. 错误为 401,您使用IsAuthenticated 权限。首先在setUpClasssetUp 中创建一个用户,然后在setUp 中使用该用户登录
        def setUp(self) -> None:
            self.client.force_login(self.user)
    
    1. 对于“未找到”,您返回 Response({"message": "No Data found"}),但它应该返回状态代码 404。

    我知道你对这些东西比较陌生。也许先从ModelViewSet 开始。它将强制执行最佳实践,并且您可能会编写更少的代码。

    【讨论】:

      猜你喜欢
      • 2012-12-31
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      相关资源
      最近更新 更多