Макетные методы, названные в импортеPython

Программы на Python
Anonymous
Макетные методы, названные в импорте

Сообщение Anonymous »

У меня есть функция get_number(), которую я хочу высмеять.
Мой код выглядит следующим образом:

Код: Выделить всё

from project_mock.library import get_number

def my_method_1() -> int:
return get_number()

Код: Выделить всё

library.py

Код: Выделить всё

def get_number() -> int:
return 1
Я хочу протестировать этот код с помощью pytest, но не хочу, чтобы get_number() запускался. Вместо этого я хочу высмеять его и переопределить его вывод. Мой тест выглядит следующим образом:

Код: Выделить всё

import pytest
from pytest_mock import MockerFixture
from mock import MagicMock

from project_mock.main import my_method_1

@pytest.fixture
def mock_get_number(mocker: MockerFixture) -> MagicMock:
mocked_fn = mocker.patch("project_mock.library.get_number", autospec=True)
mocked_fn.return_value = 2
return mocked_fn

def test_mocking(mock_get_number: MagicMock) -> None:
assert my_method_1() == 2
mock_get_number.assert_called_once()
Этот код завершается с ошибкой:

Код: Выделить всё

    def test_mocking(mock_get_number: MagicMock) -> None:
>       assert my_method_1() == 2
E       assert 1 == 2
E        +  where 1 = my_method_1()
Однако, если я заменю импорт в main.py следующим образом:

Код: Выделить всё

from project_mock import library

def my_method_1() -> int:
return library.get_number()
Тогда макет сработает, и мой тест пройдет. Почему издевательство не работает, когда я импортирую метод напрямую, но работает при импорте библиотеки? И есть ли какой-нибудь способ разрешить импорт именованных методов в мой код, который по-прежнему позволяет использовать макеты в моих тестах?
Я хочу избежать необходимости изменять правильный рабочий код для соответствия тестам.

Вернуться в «Python»