首页 > 解决方案 > 如何在 django rest 框架中为基于通用类的视图编写 api 测试用例?

问题描述

在这里,我正在为一些创建、更新视图编写一些 api 测试用例,我尝试过这样。但这给了我错误。我可能做错了什么?有什么解决方案吗?

self.assertEqual(response.status_code,status.HTTP_200_OK)
AssertionError: 403 != 200

----------------------------------------------------------------------
Ran 2 tests in 0.031s

FAILED (failures=2)
Destroying test database for alias 'default'...

网址.py

app_name = 'product'
urlpatterns = [
    path('create/', ProductCreateAPIView.as_view(), name='create-product'),
    path('list/', ProductListAPIView.as_view(), name='list-product'),
    path('detail/<int:pk>/', ProductDetailAPIView.as_view(), name='detail-product'),
]

视图.py

class ProductCreateAPIView(generics.CreateAPIView):
    serializer_class = ProductSerializer
    permission_classes = [IsAdminUser]
class ProductListAPIView(generics.ListAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = [IsAdminUser]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['name', 'description', 'category']
class ProductDetailAPIView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = [IsAdminUser]

测试.py

CREATE_PRODUCT_URL = reverse('product:create-product')
LIST_PRODUCT_URL = reverse('product:list-product')
class CreateProductTest(APITestCase):
    def setUp(self):
        self.client = Client()
    def test_details(self):
        response = self.client.post(CREATE_PRODUCT_URL,format='json')
        print(response.status_code)
        self.assertEqual(response.status_code,status.HTTP_201_CREATED)
class ListProductTest(APITestCase):
    def setUp(self):
        self.client = Client()
    def test_details(self):
        response = self.client.get(LIST_PRODUCT_URL,format='json')
        print(response.status_code)
        self.assertEqual(response.status_code,status.HTTP_200_OK)

标签: djangodjango-rest-framework

解决方案


您将获得 403 代码,因为您的所有视图都只允许超级用户使用,因为该IsAdminUser权限。

您需要以管理员用户身份登录来进行测试。你可以使用login方法Client()来做到这一点。

对于您的 Create 测试方法,您需要在输入中提供有效的产品,因为您想要测试应该创建产品的视图。

这是您的示例测试用例CreateProductTestand ListProductTest

from django.contrib.auth import get_user_model
from django.test import Client, TestCase
from django.urls import reverse

from rest_framework import status


CREATE_PRODUCT_URL = reverse('product:create-product')
LIST_PRODUCT_URL = reverse('product:list-product')


class CreateProductTest(TestCase):

    def setUp(self):
        self.client = Client()
        self.user = get_user_model().objects.create_superuser(
                "admintest",
                "admintest@admintest.com",
                "admintest"
            )
        self.client.login(username='admintest', password='admintest')

    def test_details(self):
        payload = {
            'product_key1', 'product_value1',
            'product_key2', 'product_value2',
            # ...
        }
        response = self.client.post(CREATE_PRODUCT_URL, payload)
        print(response.status_code)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)


class ListProductTest(APITestCase):

    def setUp(self):
        self.client = Client()
        self.user = get_user_model().objects.create_superuser(
                "admintest",
                "admintest@admintest.com",
                "admintest"
            )
        self.client.login(username='admintest', password='admintest')

    def test_details(self):
        response = self.client.get(LIST_PRODUCT_URL,format='json')
        print(response.status_code)
        self.assertEqual(response.status_code,status.HTTP_200_OK)

推荐阅读