Макет функции, которая вызывается при импорте модуля

Я хочу протестировать модуль A, который использует декораторы с аргументами. Аргументы оцениваются при загрузке модуля A. Для некоторых аргументов декоратора я устанавливаю значение, вызывая функцию foo в модуле B.

# A.py
import B

@deco(arg1=B.foo())
def bar():
  ...

Когда я хочу протестировать A, я хочу имитировать B.foo, чтобы аргумент декоратора был установлен для моих тестовых случаев. Я думаю, что B.foo нужно издеваться до того, как A загрузит B.

В модульном тесте, как вызывающая сторона A, как мне имитировать B.foo, чтобы убедиться, что фиктивная версия используется при оценке аргументов декоратора в A?


person CppNoob    schedule 26.05.2020    source источник
comment
Укажите соответствующие сегменты кода.   -  person cicolus    schedule 27.05.2020


Ответы (1)


Если вы хотите убедиться, что макет действительно используется, вы должны перезагрузить модуль A после исправления foo, так как bar уже был оценен с исходным foo. Вы можете обернуть это в приспособление, подобное этому (непроверенное):

import importlib
import pytest
from unittest import mock
import A

@pytest.fixture
def mocked_foo():
    with mock.patch('B.foo') as mocked:
        importlib.reload(A)
        yield mocked

def test_bar(mocked_foo):
    ...
person MrBean Bremen    schedule 27.05.2020