Python django测试视图仅适用于主键

Python django测试视图仅适用于主键,python,django,unit-testing,django-rest-framework,django-views,Python,Django,Unit Testing,Django Rest Framework,Django Views,我正在做一个django项目。我已经建立了前端和后端。现在我想写单元测试 我想测试一个基于类的视图,用于从url'''path('posts/',Postview.as_view(),name=“posts'),''创建、删除和检索博客文章 我的Postview视图如下: class Postview(views.APIView, LimitOffsetPagination): authentication_classes = [TokenAuthentication, ] pe

我正在做一个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 但是如果我改变网址 到

测试结果为200 k。 另外,如果我通过
client.post(“/api/posts/”,self.post)创建一个新的post#这里是通过自定义post类的post模型创建的post对象。
响应返回401=200 我想知道它为什么会这样,我想知道如何为这段代码创建单元测试。 多谢各位

  • 所以你写了一篇关于
    POST
    方法的文章,但是
  • 这里使用
    GET
    方法

  • POST
    不接受任何
    pk
    ,因为它创建了一个新资源。 所以这是无效的
  • 错误为401,您使用
    IsAuthenticated
    权限。首先在
    setUpClass
    setUp
    中创建用户,然后在
    setUp
    中使用此用户登录
  • 对于“未找到”,您返回
    响应({“消息”:“未找到数据”})
    ,但它应该返回状态代码404
  • 我看你对这些东西还比较陌生。可以先从
    ModelViewSet
    开始。它将强制执行最佳实践,并且您可能会编写更少的代码

    response=client.get("/api/posts/1")
    
    
    def test_post_view(self):
            client=self.get_client()
            response=client.get("/api/posts/")# this line
            self.assertEqual(response.status_code,200)
    
    client.post("/api/posts/",self.post)
    
        def setUp(self) -> None:
            self.client.force_login(self.user)