如何获得不是HttPretty中最后一个的请求?

时间:2018-05-20 10:50:02

标签: python unit-testing python-requests httpretty

使用Python的HTTPretty库,我可以为单元测试创​​建模拟HTTP响应。当我测试的代码运行时,而不是我的请求到达第三方,请求被截获,我的代码收到我配置的响应。

然后我使用last_request()并检查我的代码请求的网址,任何参数等。

我想知道的是,我不仅可以访问最后一个请求,还可以访问我的代码在最后一个请求之前发送的任何其他请求。

这似乎是可能的。在文档中,它使用名为latest_requests的列表。例如here

但这似乎对我不起作用。我得到了一个AttributeError AttributeError: module 'httpretty' has no attribute 'latest_requests'

这里有一些代码说明了我想要做什么以及我在哪里得到AttributeError

import httpretty
import requests

httpretty.enable()
httpretty.register_uri(
    method=httpretty.GET,
    uri='http://www.firsturl.com',
    status=200,
    body='First Body'
)

httpretty.enable()
httpretty.register_uri(
    method=httpretty.GET,
    uri='http://www.secondurl.com',
    status=200,
    body='secondBody'
)

firstresponse = requests.get('http://www.firsturl.com')
secondresponse = requests.get('http://www.secondurl.com')

print(httpretty.latest_requests[-1].url)

# clean up
httpretty.disable()
httpretty.reset()

谢谢!

1 个答案:

答案 0 :(得分:1)

不幸的是,在阅读完文档并尝试让代码正常工作之后,我只能将文档描述为明显不正确。似乎有three | separate |几年前的pull requests声称使httpretty.latest_requests成为一个真正的属性,但无论出于何种原因,它们都没有合并。

所有这些说法,我设法通过调用

获取所有先前请求的列表
 httpretty.HTTPretty.latest_requests

这将返回HTTPrettyRequest个对象的列表。看作httpretty.last_request()会返回HTTPrettyRequest个对象,该属性可能就是您要查找的内容。

不幸的是,.url没有在该类上定义(但它是defined on the blank request object没有任何意义)。如果您想检查请求URL是否符合您的预期,您几乎不得不尝试自己重建:

req = httpretty.HTTPretty.latest_requests[-1]
url = req.headers.get('Host', '') + req.path

如果您在查询字符串中传递任何内容,则必须从req.querystring重新构建它,尽管这不是有序的,因此您可能不希望将其转换为字符串以进行匹配。此外,如果您的所有请求都转到同一个域,则可以不使用主机部分,只需比较req.path