Имитация функции, которая вызывается при импорте модуля - PullRequest
1 голос
/ 27 мая 2020

Я хочу протестировать модуль 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?

1 Ответ

1 голос
/ 27 мая 2020

Если вы хотите убедиться, что макет действительно используется, вам нужно перезагрузить модуль 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):
    ...
...