Тестирование пользовательского действия на наборе представлений в Django Rest Framework

Я определил следующее действие клиента для моего ViewSet Agenda:

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") не появляется, и он всегда возвращает 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, и получать pk из url. Например: 'Agenda/pk_here/get_user_agenda/'

Вернуться на верх