Тестирование пользовательского действия на наборе представлений в 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/'