如何将python字典适当地转换为HttpRequest?

如何将python字典适当地转换为HttpRequest?,python,django,django-testing,django-tests,Python,Django,Django Testing,Django Tests,我有一个内置的.dict字典,看起来像这样: request = {"data": {"var": "hello", "content": "jello"}} class EmailView(APIView): """ Serializes POST data for sending emails. """ authentication_classes = [authentication.TokenAuthentication] permission_c

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

request = {"data": {"var": "hello", "content": "jello"}}
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)
我正在为django中的API端点编写测试。我正在调用该类的
post
方法并将此请求发送给它,我正在使用
request.data
访问请求中的数据。但这当然行不通,因为进入我的
post
函数的
请求实际上是一个
django.http.HttpRequest
,而不是
内置的.dict
。如何使我的
request
参数是
HttpRequest
而不是
dict
以便我的函数可以正确使用它

编辑:

好的,我有一个函数,如下所示:

request = {"data": {"var": "hello", "content": "jello"}}
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 = {"data": {"var": "hello", "content": "jello"}}
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)
但是,当然,这不起作用,因为我在测试中通过发送到我的
post
请求不是来自
rest\u 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)
使用以下命令,例如:

来自rest\u framework.test导入工厂
view=EmailView.as_view()
factory=APIRequestFactory()
request=factory.post('/url/to/the/endpoint',{“var”:“hello”,“content”:“jello”})
响应=查看(请求)

为什么不使用将请求发送到视图进行单元测试?

您是否在询问如何从
HttpRequest
中提取json正文?如果是这样,通常
json.loads(request.body)
会起作用
json
来自库。@mario_sunny让我编辑我的问题,让它更容易理解。你需要显示你的测试。你是如何调用视图的?看到了吗?我在
工厂中遇到了一个错误。post('/v1/send\u email/',request)
行上写着
AttributeError:'str'对象没有属性'\u encode\u json'
注意,因为OP使用的是REST框架,所以他们希望使用来自该库的而不是Django自己的库。@JohnLexus,请检查更新的答案,特别是如何将请求传递给您的视图,文档包含多个有用的示例。如果问题仍然存在,请显示我失踪的原因。好的,我做了所有这些,我更新了我的问题来显示这些信息。我现在得到的是
serializer=EmailSerializer(data=request.data)
AttributeError:'WSGIRequest'对象没有属性'data'
,正如错误所说,如果您要查找的是需要使用
request.POST的POST数据,则请求对象没有属性
data