在 Django Rest Framework 中测试视图集上的自定义操作
Testing custom action on a viewset in Django Rest Framework
我已经为我的 ViewSet 议程定义了以下自定义操作:
class AgendaViewSet(viewsets.ModelViewSet):
"""
A simple viewset to retrieve all the Agendas
"""
queryset = Agenda.objects.all()
serializer_class = AgendaSerializer
@action(detail=False, methods=['GET'])
def get_user_agenda(self, request, pk=None):
print('here1')
id = request.GET.get("id_user")
if not id:
return Response("No id in the request.", status=400)
id = int(id)
user = User.objects.filter(pk=id)
if not user:
return Response("No existant user with the given id.", status=400)
response = self.queryset.filter(UserRef__in=user)
if not response:
return Response("No existant Agenda.", status=400)
serializer = AgendaSerializer(response, many=True)
return Response(serializer.data)
在这里,我想对名为“get_user_agenda”的自定义操作进行单元测试。
然而,当我测试时,调试输出(“here1”)没有出现,它总是 returns 200 作为 status_code。
这是我的测试:
def test_GetUserAgenda(self):
request_url = f'Agenda/get_user_agenda/'
view = AgendaViewSet.as_view(actions={'get': 'retrieve'})
request = self.factory.get(request_url, {'id_user': 15})
response = view(request)
self.assertEqual(response.status_code, 400)
注意:
self.factory = APIRequestFactory()
我是不是漏掉了什么?
此致,
您必须使用自定义操作的方法名称而不是 retrieve
所以:
view = AgendaViewSet.as_view(actions={'get': 'get_user_agenda'})
您必须指定请求 url
@action(detail=False, methods=['GET'], url_path='get_user_agenda')
def get_user_agenda(self, request, pk=None):
我认为最好使用 detail=True,并从 url 获取 pk。
例如:'Agenda/pk_here/get_user_agenda/'
我已经为我的 ViewSet 议程定义了以下自定义操作:
class AgendaViewSet(viewsets.ModelViewSet):
"""
A simple viewset to retrieve all the Agendas
"""
queryset = Agenda.objects.all()
serializer_class = AgendaSerializer
@action(detail=False, methods=['GET'])
def get_user_agenda(self, request, pk=None):
print('here1')
id = request.GET.get("id_user")
if not id:
return Response("No id in the request.", status=400)
id = int(id)
user = User.objects.filter(pk=id)
if not user:
return Response("No existant user with the given id.", status=400)
response = self.queryset.filter(UserRef__in=user)
if not response:
return Response("No existant Agenda.", status=400)
serializer = AgendaSerializer(response, many=True)
return Response(serializer.data)
在这里,我想对名为“get_user_agenda”的自定义操作进行单元测试。
然而,当我测试时,调试输出(“here1”)没有出现,它总是 returns 200 作为 status_code。
这是我的测试:
def test_GetUserAgenda(self):
request_url = f'Agenda/get_user_agenda/'
view = AgendaViewSet.as_view(actions={'get': 'retrieve'})
request = self.factory.get(request_url, {'id_user': 15})
response = view(request)
self.assertEqual(response.status_code, 400)
注意:
self.factory = APIRequestFactory()
我是不是漏掉了什么?
此致,
您必须使用自定义操作的方法名称而不是 retrieve
所以:
view = AgendaViewSet.as_view(actions={'get': 'get_user_agenda'})
您必须指定请求 url
@action(detail=False, methods=['GET'], url_path='get_user_agenda')
def get_user_agenda(self, request, pk=None):
我认为最好使用 detail=True,并从 url 获取 pk。 例如:'Agenda/pk_here/get_user_agenda/'