在测试使用请求库的Python软件时,建议模拟requests.sessions.Session.request
。
不幸的是,当我不得不处理HTTP身份验证时似乎不能很好地工作,我觉得我在请求中嘲笑一个太高的抽象层。我如何拦截/模拟请求,以便我不必自己处理身份验证(并获得适当的标头)?
答案 0 :(得分:3)
请勿嘲笑Session
,请使用Transport Adapter
。 =)
Session
对象对请求进行了大量处理,并在该级别修补它将无法获得请求。
相反,请写一个Transport Adapter
send()
方法存储PreparedRequest
对象。
有关示例,请参阅the official docs和an article I wrote。但是,你会想要这样的东西:
from requests.adapters import HTTPAdapter
class TestAdapter(HTTPAdapter):
"""
A Transport Adapter that stores all requests sent, and provides pre-canned responses.
"""
def __init__(self, responses):
self.responses = responses
self.requests = requests
def send(self, request, *args, **kwargs):
self.requests.append(request)
return self.responses.pop(0)
要使其正常工作,responses
将需要是urllib3.Response
对象的列表或类似于请求可以使用的对象。 TestAdapter.requests
将是requests.PreparedRequest
个对象的列表。
如果您不想完成所有这些工作,可以尝试使用betamax。