如何将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