如何将python字典转换为HttpRequest?

2024-06-16 13:57:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个builtins.dict字典,看起来像这样:

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

我正在为django中的API端点编写一个测试。我正在调用该类的post方法并将此请求发送给它,我正在使用request.data访问请求中的数据。但这当然行不通,因为进入我的post函数的request实际上是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)

但是,当然,这不起作用,因为我在测试中通过我的发送到我的postrequest不是来自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)

Tags: 函数testselfcomdatareturninitemail
2条回答

为什么不直接使用django test client将请求发送到视图进行单元测试呢?你知道吗

使用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)

相关问题 更多 >