Как утвердить исключение, которое регистрируется и не влияет на ответную реакцию
Я тестирую API, который может вызвать исключение, но в итоге возвращает ответ, основанный на других вычислениях, не связанных с возникшим исключением (он только регистрирует исключение):
def get(self, request):
#some code here
try:
#do something and create the response value
except Exception as err:
logger.exception(str(err))
return Response
Я попытался проверить, поднимается ли исключение, но это не сработало, так как конечное возвращаемое значение (ответ API) не заботится об исключении:
with pytest.raises(RuntimeError):
response = MyInfo.as_view(
)(request)
Я получаю следующее:
> with pytest.raises(RuntimeError):
E Failed: DID NOT RAISE <class 'RuntimeError'>
несмотря на то, что в лог записывается исключение RuntimeError. Я думаю, что pytest заботится только об ответе API, а не об исключении, которое произошло внутри API.
--------- РЕДАКТИРОВАТЬ --------
Есть предложение по использованию caplog. Поскольку я использую @patch в своей тестовой функции, я не могу передать 'caplog' в качестве аргумента функции. Я попробовал этот предложенный метод внутри моего conftest.py следующим образом:
@pytest.fixture()
def my_caplog(caplog):
with caplog.at_level(logging.INFO):
yield
print(caplog.text)
но ничего не выводится. Не уверен, как использовать его в этом случае.
Обзор светильника caplog?
Один из вариантов - сделать что-то вроде
def test_raises_exception(caplog):
assert "exception" in caplog.text.lower()
Обновленный пример
import logging
from unittest.mock import patch
class Foo:
def bar(self):
pass
class TestFoo:
@patch.object(Foo, "bar")
def test_stuff(self, mock_bar, caplog):
logging.exception("ERROR")
assert "ERROR" in caplog.text