Как пропатчить ключевое слово повышение (или возврат) в Python для модульного тестирования? - PullRequest
0 голосов
/ 01 июля 2019

Какое пространство имен для ключевых слов 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

1 Ответ

2 голосов
/ 01 июля 2019

Вы не можете исправлять ключевые слова.Они являются частью синтаксиса Python.Когда интерпретатор Python берет часть кода Python, он анализирует его и за несколько шагов преобразует в некоторое внутреннее представление («байт-код»).Байт-код, однако, больше не имеет прямого отношения к исходному исходному коду - ключевые слова «исчезли».

Напротив, атрибуты модуля и класса, а также их доступ из кода по-прежнему будут находиться вбайт-код.Исправление - это в основном временная замена таких атрибутов.

Или, иначе говоря, вы можете исправлять атрибуты, но ключевые слова не являются атрибутами.

...