我想对我的Python Azure函数进行单元测试。我正在遵循Microsoft文档。
文档模拟了对函数的调用,如下所示
req = func.HttpRequest(
method='GET',
body=None,
url='/api/HttpTrigger',
params={'name': 'Test'})
我想这样做,但将参数作为JSON对象传递,这样我就可以遵循函数代码的req_body = req.get_json()
分支。我想我可以用这样的函数调用来做到这一点
req = func.HttpRequest(
method='GET',
body=json.dumps({'name': 'Test'}),
url='/api/HttpTrigger',
params=None)
如果我这样构造调用,req.get_json()
将失败,并返回错误消息AttributeError: 'str' object has no attribute 'decode'
。
如何使用JSON输入参数构造请求?这应该是微不足道的,但我显然错过了一些显而易见的东西。
如果我按如下方式构造模拟调用:
import json
req = func.HttpRequest(
method='POST',
body=json.dumps({'name': 'Test'}).encode('utf8'),
url='/api/HttpTrigger',
params=None)
然后我可以成功地呼叫req.get_json()
。感谢@MrBeanRemen和@JoeyCai为我指明了正确的方向,即不要调用GET
并将消息设为字节字符串。
任何HTTP请求消息都允许包含消息体,因此解析消息时必须考虑到这一点。但是,GET的服务器语义受到限制,因此主体(如果有的话(对请求没有语义意义。解析的需求与方法语义的需求是分开的。
对于您的http请求,它是一个GET
方法您可以使用GET发送请求正文,但它不应该有任何意义
因此,使用下面的代码构造一个带有json负载的模拟HTTP请求。有关更多详细信息,您可以参考本文。
req = func.HttpRequest(
method='GET',
body=None,
url='/api/HttpTrigger',
params={'name': 'Test'})
更新:
对于Post
请求,您可以使用body=json.dumps({'name': 'Test'}).encode('utf8')
发送json有效载荷,而正文需要字节字符串:
req = func.HttpRequest(
method='POST',
body=json.dumps({'name': 'Test'}).encode('utf8'),
url='/api/HttpTrigger',
params=None)