如何在不丢失身份验证的情况下模拟Session.request?

时间:2014-03-29 16:14:59

标签: python unit-testing python-requests

在测试使用请求库的Python软件时,建议模拟requests.sessions.Session.request

不幸的是,当我不得不处理HTTP身份验证时似乎不能很好地工作,我觉得我在请求中嘲笑一个太高的抽象层。我如何拦截/模拟请求,以便我不必自己处理身份验证(并获得适当的标头)?

1 个答案:

答案 0 :(得分:3)

请勿嘲笑Session,请使用Transport Adapter。 =)

Session对象对请求进行了大量处理,并在该级别修补它将无法获得请求。

相反,请写一个Transport Adapter send()方法存储PreparedRequest对象。

有关示例,请参阅the official docsan 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