Как исправить динамический импорт в тестах python?

#python #unit-testing #mocking #python-unittest

Вопрос:

У меня есть приведенная ниже структура файлов в моем проекте. Магия в основном содержит оболочки вокруг сторонних библиотек.

 .
├── magic
│   └── __init__.py
│   └── mock.py
│   └── real.py
 

Поэтому, основываясь на переменных среды, мы импортируем методы либо mock.py полностью, либо real.py . Теперь я хочу написать модульные тесты для некоторых методов, которые используют эти волшебные методы magic . Содержание __init__.py приведено ниже.

 if SOME_ENV:
    from .mock import (
        magic_method
    )
else:
    from .real import (
        magic_method
    )

__all__ = [
    "magic_method"
]
 

В модульных тестах, когда я хочу исправить их и посмотреть, был ли magic_method вызван, я всегда получаю его так, как будто magic_method он никогда не вызывался, но он вызывается каждый раз, когда я запускаю сценарий. Ниже приведен пример test_case()

 def test_magic(db):
    with patch("magic.mock.magic_method") as magic_method:
        # something
    assert magic_method.called
 

Вышеуказанный тест каждый раз терпит неудачу. Есть какие-нибудь предложения?

Комментарии:

1. Вы импортируете magic_method в magic ( from xxx import magic_method ), поэтому вам нужно исправить этот метод: patch("magic.magic_method") .

2. Да, я тоже пробовал @MrBeanBremen, но это не сработало

3. Ну, это зависит от того, что вы делаете в «чем-то» и как magic_method туда импортируется.