单元测试Python Azure函数:如何使用JSON负载构建模拟测试请求消息



我想对我的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)

相关内容

  • 没有找到相关文章

最新更新