gpt4 book ai didi

python - requests post 函数中的 Pytest 装置

转载 作者:行者123 更新时间:2023-12-03 08:04:14 26 4
gpt4 key购买 nike

我正在尝试理解提供的示例 here并模拟它适用于 post 方法而不是 get 方法。

当我测试 response.status_code == 200 时,一切正常。如何在不重复代码的情况下测试多个响应状态代码(例如 here ?我知道需要使用固定装置,我该如何利用它们?

这就是我目前为止的情况。

app.py

from typing import Dict, Union
from urllib.error import HTTPError

import requests
import structlog

logger = structlog.get_logger()


def get_access_token(
url: str, client_id: str, client_secret: str, grant_type: str
) -> Union[Dict[str, Union[str, int]], None]:
try:
r = requests.post(
url,
data={"grant_type": grant_type},
auth=(client_id, client_secret),
verify=True,
)
logger.info("Fetching token status code", status_code=r.status_code)
except HTTPError as http_err:
logger.error("HTTP error occurred", http_error=str(http_err))
except Exception as err:
logger.error("Other error occurred", exception=str(err))
else:
# The token expires in 10800 seconds
return r.json()
test_app.py

# contents of test_app.py, a simple test for our API retrieval
from typing import Dict, Union

import pytest
import requests

from app import get_access_token


# custom class to be the mock return value of requests.post()
class MockResponse:
status_code = 200
raise_for_status = None

@staticmethod
def json() -> Dict[str, Union[str, int]]:
return {
'access_token': 'fake-access-token',
'token_type': 'fake-token-type',
'expires_in': 10800,
}

@pytest.fixture
def mock_response(monkeypatch):
"""Requests.post() mocked to return json."""

def mock_post(*args, **kwargs):
return MockResponse()

monkeypatch.setattr(requests, "post", mock_post)


# notice our test uses the custom fixture instead of monkeypatch directly
def test_get_access_token_success(mock_response) -> None:
result = get_access_token(
url="https://fakeurl",
client_id="fake-client-id",
client_secret="fake-client-secret",
grant_type="fake-grant-type",
)
assert result['access_token'] == "fake-access-token"
assert result['token_type'] == "fake-token-type"

根据@gold_cy的建议重写了app.py

from typing import Dict, Union

import requests
import structlog

logger = structlog.get_logger()


def get_access_token(
url: str,
client_id: str,
client_secret: str,
grant_type: str = 'client_credentials',
) -> Dict[str, Union[str, int]]:
try:
r = requests.post(
url,
data={"grant_type": grant_type},
auth=(client_id, client_secret),
verify=True,
)
logger.info("Fetching token status code", status_code=r.status_code)
r.raise_for_status()
if r.status_code == 200:
# FIXME: The token expires in 10800 seconds
return r.json()
except requests.exceptions.HTTPError as err:
logger.error("HTTP error", request=err.response.text)
raise requests.HTTPError(err)

最佳答案

无需过多更改代码,并假设测试 status_code,您就可以让您的装置返回一个可以提供 status_code 的函数raise_for_status 到,以初始化您的 MockResponse 类。但是,查看您的 token 代码,您似乎没有使用 raise_for_status

class MockResponse:
def __init__(self, status_code, raise_for_status):
self.status_code = status_code
self.raise_for_status = raise_for_status

@staticmethod
def json() -> Dict[str, Union[str, int]]:
return {
'access_token': 'fake-access-token',
'token_type': 'fake-token-type',
'expires_in': 10800,
}

@pytest.fixture
def mock_response(monkeypatch):
"""Requests.post() mocked to return json."""
def wrapper(status_code, raise_for_status=None):
def mock_post(*args, **kwargs):
return MockResponse(status_code, raise_for_status)

monkeypatch.setattr(requests, "post", mock_post)

return wrapper


def test_some_random_status_code(mock_response) -> None:
mock_response(301)

result = get_access_token(
url="https://fakeurl",
client_id="fake-client-id",
client_secret="fake-client-secret",
grant_type="fake-grant-type",
)

assert result['access_token'] == "fake-access-token"

platform darwin -- Python 3.8.9, pytest-7.0.1, pluggy-1.0.0
rootdir: ***
plugins: asyncio-0.18.3, hypothesis-6.48.1, mock-3.7.0
asyncio: mode=strict
collected 1 item

tests/test_manager.py 2022-07-11 07:13.35 [info ] Fetching token status code status_code=301
.

========================================= 1 passed in 0.04s =========================================

关于python - requests post 函数中的 Pytest 装置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72933954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com