【问题标题】:Python Mock two functions in Pytest test using MagicMockPython 使用 MagicMock 在 Pytest 测试中模拟两个函数
【发布时间】:2020-07-19 20:09:32
【问题描述】:

这是我要测试的功能。

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: the JSON object must be str, bytes or bytearray, not 'MagicMock'

【问题讨论】:

    标签: python-3.x testing mocking pytest magicmock


    【解决方案1】:

    问题出在document = json.loads(response.text),当一个MagicMock实例被传递到json.loads()时。

    这就是解决问题的方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 2021-05-18
      相关资源
      最近更新 更多