django - 如何在 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)
解决方案
您将获得 403 代码,因为您的所有视图都只允许超级用户使用,因为该IsAdminUser
权限。
您需要以管理员用户身份登录来进行测试。你可以使用login
方法Client()
来做到这一点。
对于您的 Create 测试方法,您需要在输入中提供有效的产品,因为您想要测试应该创建产品的视图。
这是您的示例测试用例CreateProductTest
and 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)
推荐阅读
- javascript - 是否可以在不使用 for 循环的情况下找到素数?可以仅使用过滤器方法完成吗?
- java - Blob 提交到 DB 的错误是什么?
- powershell - 将变量的结果组合到哈希表中并显示所有值
- flutter - 如何创建始终部分可见的持久底页?
- bash - 显示可用选项而不完成
- java - 使用辅助类实例化对象
- ios - AppstoreConnect:公司个人开发者名称而不是应用描述
- google-api - Google-Hire > 候选人列表过滤器参数不起作用
- python - 在python中的“from bar import foo”之后,“[foo]”有什么特殊含义吗?(也许是 python2 特定的)
- amazon-s3 - 将Kafka中的Avro转Parquet直接转入S3