Как правильно преобразовать словарь Python в HttpRequest? - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть builtins.dict словарь, который выглядит следующим образом:

request = {"data": {"var": "hello", "content": "jello"}}

Я пишу тест для конечной точки API в django. Я вызываю метод post этого класса и отправляю ему этот запрос, и я получаю доступ к данным в запросе, используя request.data. Но, конечно, это не сработает, потому что request, входящий в мою функцию post, на самом деле django.http.HttpRequest, а не builtins.dict. Как мне сделать так, чтобы мой request аргумент был HttpRequest, а не dict, чтобы моя функция могла его правильно использовать?

Редактировать:

Хорошо, у меня естьфункция, которая выглядит следующим образом:

class EmailView(APIView):
    """
    Serializes POST data for sending emails.
    """
    authentication_classes = [authentication.TokenAuthentication]
    permission_classes = [permissions.IsAuthenticated]

    def post(self, request):
        """
        Sends an email using SES
        :param request: POST request
        :return: drf http response
        """

        serializer = EmailSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        args = serializer.data
        send_mail(args.get("subject"), args.get("message"), "info@mycomp.io", args.get("to"), fail_silently=False)
        return Response('Email sent.', status=status.HTTP_200_OK)

Я хочу проверить эту функцию. Итак, я написал что-то вроде этого:

class EmailTests(APITestCase):

    def setup(self):
        self.user = UserProfile.objects.create_user(
            'testuser', email='testuser@test.com', password='testpass')
        self.user.save()

    def init_request(self):
        request = {"data": {"sender": "info@mycomp.io", "to": ["test@gmail.com", "testt@gmail.com"],
                            "subject": "Subject", "message": "Hello"}}

        return request

    def test_incorrect_email(self):
        request = self.init_request()

        reponse = EmailView.post(EmailView, request)
        print(reponse)

Но, конечно, это не работает, потому что request я посылаю через мой на post в тестене фактический запрос от rest_framework.request. Думаю, я говорю, что понятия не имею, как правильно написать тест для этого ... есть идеи?

Редактировать:

Мои новые тесты. Класс EmailView не изменился.

class EmailTests(APITestCase):

    def setup(self):
        self.user = UserProfile.objects.create_user(
            'testuser', email='testuser@test.com', password='testpass')
        self.user.save()

    def init_request(self):
        request = {"sender": "info@mycomp.io", "to": ["test@gmail.com", "testt@gmail.com"],
                            "subject": "Subject", "message": "Hello"}

        return request

    def test_incorrect_email(self):
        request = self.init_request()
        factory = APIRequestFactory()
        request = factory.post('/v1/send_email/', request)
        view = EmailView()
        reponse = view.post(request)
        print(reponse)

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Используйте Django REST Framework RequestFactory , например:

from rest_framework.test import APIRequestFactory

view = EmailView.as_view()
factory = APIRequestFactory()
request = factory.post('/url/to/the/endpoint', {"var": "hello", "content": "jello"})
reponse = view(request)
0 голосов
/ 04 ноября 2019

Почему бы просто не использовать тестовый клиент django , чтобы отправить запрос представлению для модульного тестирования?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...