Запросы Python: assert status_code не является ошибочным - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь выполнить тест с конкретным сообщением об ошибке, если вызов API возвращает код 403. Я пробовал пару вариантов:

if int(addresses.status_code) is 403:
    fail("Auth Error: Missing Role {}".format(response.json()))

assert addresses.status_code is not 403

assert addresses.status_code is not codes.forbidden

assert addresses.status_code is codes.ok

Единственный из них, который терпит неудачу - последний, assert addresses.status_code is codes.ok. Тем не менее, код состояния, на который отвечает вызов API с , равен 403. Я пытался убедиться, что типы одинаковы и т. Д., Но не уверен, куда еще идти.

Как проверить, что код_состояния не является конкретным значением?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы используете is, который проверяет идентичность двух объектов. Для сравнения int s следует использовать ==. На самом деле всегда используйте ==, за исключением случаев проверки синглетонов (т.е. None) или когда вам действительно нужно.

0 голосов
/ 04 мая 2018

is тесты для идентичности . Код состояния действительно не совпадает с объектом 403 или codes.forbidden. Значением состояния является целое число, а не объект перечисления синглтона.

Используйте ==, чтобы проверить, совпадает ли значение :

if addresses.status_code == 403:
    # ...

assert addresses.status_code != 403
assert addresses.status_code != codes.forbidden
assert addresses.status_code == codes.ok

или просто используйте

addresses.raise_for_status()  # raises an exception if not 1xx, 2xx or 3xx

Метод Response.raise_for_status() вызывает исключение requests.exceptions.HTTPError (подкласс requests.exceptions.RequestException, в свою очередь подкласс OSError).

Обратите внимание, что иногда is будет работать с целыми числами или любым количеством других типов. Но если нет специальной документации, в которой вы можете использовать тесты идентичности, вы вместо этого нашли подробности реализации, где Python будет повторно использовать объекты по соображениям производительности. Так обстоит дело с маленькими целыми числами (от -5 до 256), со строками в некоторых случаях и многими другими угловыми случаями. Так что address.status_code is 200 просто работает в современных интерпретаторах CPython, но это не дано и на него не следует полагаться .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...