请求库中的模拟会话

时间:2013-06-24 10:35:28

标签: python unit-testing mocking

在我的python代码中,我有全局requests.session实例:

import requests
session = requests.session()

如何使用Mock模拟它?这种操作有装饰器吗?我试过以下:

session.get = mock.Mock(side_effect=self.side_effects)

但是(正如预期的那样)此代码在每次测试后都不会将session.get返回到原始状态,例如@mock.patch装饰器。

4 个答案:

答案 0 :(得分:4)

使用mock.patch修补模块中的会话。在这里,一个完整的工作示例https://gist.github.com/k-bx/5861641

答案 1 :(得分:1)

从前面的答案中得到一些灵感:

mock-attributes-in-python-mock

我能够模拟这样定义的会话:

class MyClient(object):
    """
    """
    def __init__(self):
        self.session = requests.session()

表示:(对 get 的调用会返回 status_code 属性设置为200的响应)

def test_login_session():
    with mock.patch('path.to.requests.session') as patched_session:
        # instantiate service: Arrange
        test_client = MyClient()
        type(patched_session().get.return_value).status_code = mock.PropertyMock(return_value=200)

        # Act (+assert)
        resp = test_client.login_cookie()

        # Assert
        assert resp is None

答案 2 :(得分:0)

由于requests.session()返回Session类的实例,因此也可以使用patch.object()

from requests import Session
from unittest.mock import patch

@patch.object(Session, 'get')
def test_foo(mock_get):
    mock_get.return_value = 'bar'   

答案 3 :(得分:0)

我发现了the requests_mock library。这省了我很多麻烦。有了pytest ...

def test_success(self, requests_mock):
    """They give us a token.
    """
    requests_mock.get("https://example.com/api/v1/login", 
        text=(
          '{"result":1001, "errMsg":null,'
          f'"token":"TEST_TOKEN",' '"expire":1799}'))

    auth_token = the_module_I_am_testing.BearerAuth('test_apikey')

    assert auth_token == 'TEST_TOKEN'

我正在测试的模块具有我的BearerAuth类,该类命中端点以获取令牌以开始request.session。