Недавно я начал использовать pytest, а совсем недавно начал использовать mock для имитации запросов библиотека. Я сделал объект request.Response в порядке, и для кода состояния 200 он работает нормально. Что я пытаюсь сделать здесь, так это использовать raise_for_status() для проверки ошибки превышения лимита скорости и проверки обработки исключения с помощью pytest.
Я использую параметр Mock side_effect, который, кажется, запускает исключение, на которое я надеюсь, но pytest, похоже, не распознает, что это произошло, и не проходит тест.
Какие-нибудь мысли? Я уверен, что это что-то очевидное, что мне не хватает!
Код, который у меня есть для класса:
class APIClient:
def get_records(self, url):
try:
r = requests.get(url)
r.raise_for_status()
return r.json()
except requests.HTTPError as e:
print("Handling the exception")
В тестовом классе у меня есть:
@pytest.fixture
def http_error_response(rate_limit_json):
mock_response = mock.Mock()
mock_response.json.return_value = rate_limit_json
mock_response.status_code = 429
mock_response.raise_for_status.side_effect = requests.exceptions.HTTPError
return mock_response
class TestRecovery(object):
@mock.patch('requests.get')
def test_throws_exception_for_rate_limit_error\
(self, mock_get, api_query_object, http_error_response):
mock_get.return_value = http_error_response
print(http_error_response.raise_for_status.side_effect)
url = api_query_object.get_next_url()
with pytest.raises(requests.exceptions.HTTPError):
api_query_object.get_records(url)
Вывод, который я получаю:
with pytest.raises(requests.exceptions.HTTPError):
> api_query_object.get_records(url)
E Failed: DID NOT RAISE
---------------------- Captured stdout call ----------------------
<class 'requests.exceptions.HTTPError'>
Handling the exception
raise_for_status
, а затем в результате вызываетсяprint
. В качестве альтернативы (и предпочтительно, на мой взгляд), пусть метод действительно вызовет ошибку, а затем обработает ее в вызывающем объекте. - person jonrsharpe   schedule 20.02.2016unittest.mock
отлично подходит для общего насмешливого, фальшивого а заглушка, в частности дляrequests
,requests-mock
может быть более интуитивно понятной. - person das-g   schedule 20.02.2016except
и проверить, что вызывается? - person huwf   schedule 20.02.2016