Метод Python HTTP Post возвращает ответ в виде объекта magicmock вместо значения - PullRequest
1 голос
/ 02 мая 2019

Я пытаюсь проверить код состояния ответа после запуска некоторого API с помощью метода POST. Код состояния ответа относится к типу экземпляра Magicmock, я проверяю, находится ли код состояния между 400 и 500, используя оператор сравнения, который работает в python 2но вызывает TypeError в python 3

import mock
response = <MagicMock name='Session().post()' id='130996186'>

Ниже код работает в python 2

if (400 <= response.status_code <= 500):
    print('works')

Но при выполнении в python 3 возникает

TypeError: '<='не поддерживается между экземплярами int и MagicMock </h1> класс BMRAPI (объект): root_url = нет def __init__(self, user, api_key, root_url=BMR_URL, api_uri=RESULTS_API_URI): self.log = logging.getLogger("BMRframework.Reporting.BMR6.BMRAPI") self.root_url = root_url self.url = urljoin(root_url, api_uri) self.log.info("Connecting to BMR REST API: %s" % self.url) self.session = requests.Session() auth = 'ApiKey {0}:{1}'.format(user, api_key) self.session.headers.update({ 'Content-type': 'application/json', 'Accept': 'text/plain', 'Authorization': auth}) self.session.trust_env = False # bypass the proxy self.log.debug("Authenticating as: %s" % user) self.log.debug("Using API Key: %s" % api_key)`enter code here` self.log.info("Connection to REST API successful") def url_for_resource(self, resource_name): return urljoin(self.url, resource_name) + "/" def create(self, resource_name, data): response = self.session.post(self.url_for_resource(resource_name), json.dumps(data), timeout=TIMEOUT) return self.handle_response(response) def handle_response(self, response): if (400 <= response.status_code <= 500): print('mars') Ниже приведен тестовый блок UNIT

@mock.patch("requests.Session")
def BMRAPI(Session):
    api = BMRAPI('http://1.2.3.4/', 'dummy_user', '12345')
    data = {'hello': 123}
    api.create('testresource', data)

1 Ответ

0 голосов
/ 17 июня 2019

Это не совсем исправление, это скорее обходной путь.

Вместо того, чтобы проводить сравнение <=, напишите отдельный метод:

def is_4xx_or_5xx_code(status_code):
    return 400 <= status_code <= 500

if is_4xx_or_5xx_code(status_code=response.status_code):
    print('works')

Затем высмеивайте его в своемтесты.

@mock.patch('path.to_code.under_test.is_4xx_or_5xx_code')
def test_your_method(mock_status_code):
    mock_status_code.return_value = True
    # rest of the test.
...