如何在 pytest==7.0.1 中使用视图集和序列化器在测试 djangorestframework==3.13.1 get_serializer() 和 get_permission() 中参数化?
How to Use Viewsets and Serializers in pytest==7.0.1 Parametrize in Testing djangorestframework==3.13.1 get_serializer() and get_permission()?
我正在使用来自 here 的 Django 项目模板。我正在我的应用程序的每个 viewset 中测试我的 serializers 和 permission。我想使用 pytest 中的参数化来减少我需要为每个序列化程序和视图集编写测试的行数。我有 10 个序列化器和视图集需要测试,它们具有如下所示的模式。
test_drf_viewsets.py
@pytest.mark.parametrize(
("app_url", "app_viewset", "serializer"),
[
(
"api:mv-signup-list",
viewset.UserSignUpMaterializedViewSet,
serializers.UserSignUpMaterializedViewSerializer,
),
(
"api:mv-total-list",
viewset.TotalMaterializedViewSet,
serializers.TotalMaterializedViewSerializer,
),
],
)
def test_get_serializer(
self,
admin_user: User,
app_url: str,
app_viewset,
serializer,
rf: RequestFactory,
):
viewsets = app_viewset
request = rf.get(reverse(app_url))
request.user = admin_user
viewsets.request = Request(request)
viewsets.format_kwarg = None
assert isinstance(viewsets.get_serializer(), serializer)
但是,当我运行上面的代码时,它显示了这个错误
TypeError: GenericAPIView.get_serializer() missing 1 required positional argument: 'self'
- 为简洁起见,省略了上述代码。
我找到了适用于我的用例的最小解决方案。
而不是使用这些:
assert isinstance(viewsets.get_serializer(), serializer)
改成这些:
assert viewsets.serializer_class == serializer
与get_permission相同:
assert viewsets.permission_classes[0] == IsAuthenticated
上面的代码在这些更改后有效。
我正在使用来自 here 的 Django 项目模板。我正在我的应用程序的每个 viewset 中测试我的 serializers 和 permission。我想使用 pytest 中的参数化来减少我需要为每个序列化程序和视图集编写测试的行数。我有 10 个序列化器和视图集需要测试,它们具有如下所示的模式。
test_drf_viewsets.py
@pytest.mark.parametrize(
("app_url", "app_viewset", "serializer"),
[
(
"api:mv-signup-list",
viewset.UserSignUpMaterializedViewSet,
serializers.UserSignUpMaterializedViewSerializer,
),
(
"api:mv-total-list",
viewset.TotalMaterializedViewSet,
serializers.TotalMaterializedViewSerializer,
),
],
)
def test_get_serializer(
self,
admin_user: User,
app_url: str,
app_viewset,
serializer,
rf: RequestFactory,
):
viewsets = app_viewset
request = rf.get(reverse(app_url))
request.user = admin_user
viewsets.request = Request(request)
viewsets.format_kwarg = None
assert isinstance(viewsets.get_serializer(), serializer)
但是,当我运行上面的代码时,它显示了这个错误
TypeError: GenericAPIView.get_serializer() missing 1 required positional argument: 'self'
- 为简洁起见,省略了上述代码。
我找到了适用于我的用例的最小解决方案。
而不是使用这些:
assert isinstance(viewsets.get_serializer(), serializer)
改成这些:
assert viewsets.serializer_class == serializer
与get_permission相同:
assert viewsets.permission_classes[0] == IsAuthenticated
上面的代码在这些更改后有效。