Какое пространство имен для ключевых слов Python, которое может перехватить mock.patch?
Когда кто-то хочет открыть патч или распечатать, можно использовать mock.patch("builtins.open")
или mock.patch("mymodule.open")
, но это не работает, например, с raise
.
Если у меня есть оператор raise somemodule.SomeException
, я мог бы легко проверить, было ли вызвано исключение, но как я могу утверждать, что на самом деле было вызвано ключевое слово повышение. Нравится (с помощью pytest
и pytest-mock
):
def test_myfunction_calls_raise(self, mocker):
mocked = mocker.patch("mymodule.raise")
mymodule.myfunction()
mocked.assert_called_once()
РЕДАКТИРОВАТЬ: у меня есть очень хороший ответ и поэтому mock.patch не применимо. Помимо этого и помимо очевидного решения - проверки результата - есть ли какой-либо другой значимый метод для проверки того, было ли ключевое слово Python (raise
, return
, ...) вызываться в коде?
РЕДАКТИРОВАТЬ 2:
Фактический код, который я хочу проверить (остановка Listener в pynput не работает должным образом в Xfce, поэтому я должен вызвать исключение, чтобы остановить поток прослушивателя):
import pynput
# ...
def stop(self):
"""Stops listener by raising an exception."""
try:
raise pynput.mouse.Listener.StopException
except pynput.mouse.Listener.StopException:
return False
РЕДАКТИРОВАТЬ 3: Метод сверху проверяется с помощью следующих двух методов испытаний:
def test_stop_stops_listener(self, mocker):
"""StopException is raised if MagicMock has got StopException attribute."""
mocked = mocker.patch("pynput.mouse.Listener")
with pytest.raises(TypeError): # catching classes that do not inherit from BaseException is not allowed
base.BaseMouse().stop()
assert hasattr(mocked, "StopException")
def test_stop_returns_False(self, mocker):
assert base.BaseMouse().stop() is False