使用MagicMock在Pytest测试中模拟两个Python函数

3

这是我正在尝试测试的函数。

def service_request(url, session=configure_session()):
    response = session.get(url)

    document = json.loads(response.text)
    return document

是的,现在它还很基础(你可能会认为它几乎没有测试价值),但如果我能让模拟工作起来,我将能够添加更多逻辑并在进行新添加时进行测试。我已经尝试了各种方法来模拟在此测试中调用的其他两个函数。其中一个是configure_session函数,另一个是requests库中的get方法。

configure_session函数构建了配置有必要发出服务请求的证书的requests.Session对象。该方法还可以选择使用CA捆绑包验证SSL连接。在文件顶部导入的config文件(未显示)检索环境变量,并且正在按预期运行。

def configure_session():
    session = requests.Session()

    session.cert = (config.client_cert, config.client_key)
    if config.ssl_verify:
        session.verify = config.ca_bundle
    else:
        session.verify = False

    user_agent = f'{config.user_agent_version}'
    session.headers.update({'User-Agent': user_agent,
                     'Accept': 'application/json'})
    return session

这是我尝试过的最新代码。 load_fixture 方法是一个测试实用工具方法,并且按预期工作。
def test_request():
    response_fixture = load_fixture('example_response.json')

    mock_session = MagicMock()
    mock_get = MagicMock()
    mock_session.get.return_value = mock_get
    mock_get.text.return_value = response_fixture

    test_url = "https://url-for-test/with/the/path/here"

    expected_headers = { 
        'Accept': 'application/json',
        'User-Agent': 'test_user_agent_from_env_vars'
         }

    service_request(test_url, mock_session)

    mock_session.get.assert_called_with(
        test_url,
        headers=expected_headers
        )
    assert response == response_fixture

当前错误为 TypeError: JSON对象必须是str、bytes或bytearray类型,而不是'MagicMock'

1个回答

2
问题出在document = json.loads(response.text),其中一个MagicMock实例被传递到了json.loads()中。以下是解决问题的方法。
mock_session = MagicMock()
mock_session.get.return_value.text = response_fixture

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接