0

所以我使用requests-mock库来模拟我对 requests 库所做的 HTTP 请求,一切都很好,直到我不得不做一个测试来捕获异常。

我要测试的功能示例

def get_wordpress_installed_plugins(url: str, user: str, password: str) -> bytes:
    try:
        credentials = user + ':' + password
        token = base64.b64encode(credentials.encode())
        header = {'Authorization': 'Basic ' + token.decode('utf-8')}
        response = requests.get(url, headers=header, verify=False)
        response.raise_for_status()
    except requests.exceptions.HTTPError as err:
        logger.exception(f"Got response from {url} correctly with error {err}.")
        raise CouldNotConnectWithApi(f"Problem retrieving information.")
    logger.info(f"Got response from {url} correctly.")
    return response.content

并且断言功能的测试没有问题

@mock.patch("checkpluginsversion.logging.Logger.info")
def test_api_wordpress_list_plugins(logger_mock, requests_mock):
    user = "user"
    password = "password"
    url = "https://www.example.com"
    expected_result = b'[{"plugin": "akismet\\/akismet", "status": "active", "name": "Akismet Anti-Spam","version": "4.2.2"}]'

    requests_mock.get(url,
                      content=b'[{"plugin": "akismet\\/akismet", "status": "active", "name": "Akismet Anti-Spam","version": "4.2.2"}]')

    result = get_wordpress_installed_plugins(url, user, password)

    assert result == expected_result
    logger_mock.assert_called_with(f"Got response from {url} correctly.")

老实说,我不知道使用这个库的 pytest 固定模式是否是最好的方法,但它对我有用。所以我遇到的问题是当我必须测试函数并引发异常时。最终,我用@mock.patch 做了一个解决方法,并为我工作。

@mock.patch("checkpluginsversion.requests.get")
@mock.patch("checkpluginsversion.logging.Logger.exception")
def test_api_should_return_an_exception(logger_mock,my_request_mock):
    user = "user"
    password = "password"
    url = "https://www.example.com"
    expected_result = b'[{"plugin": "akismet\\/akismet", "status": "active", "name": "Akismet Anti-Spam","version": "4.2.2"}]'

    my_request_mock.side_effect = requests.exceptions.HTTPError

    with pytest.raises(CouldNotConnectWithApi):
        result = get_wordpress_installed_plugins(url, user, password)

    #assert result == expected_result
    logger_mock.assert_called_with(f"Got response from {url} correctly with error .")

但是我会知道,如果有人可以向我解释如何使用 requests_mock 库的 pytest 夹具向我解释如何进行测试以引发异常,我将非常感激,谢谢!

4

0 回答 0