在 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/'