У меня есть глобальная переменная, используемая как синглтон для доступа к оборудованию:
in a.py
:
class _A():
def __init__():
# init hardware here
...
def __del__():
# close hardware connection
a = _A()
Очевидно, я не хочу оборудование инициализировано во время тестирования, поэтому я хочу имитировать a, или _A перед вызовом _A. init () когда-либо вызывается.
Я пробовал установить его с помощью фикстуры:
@pytest.fixture
def init_A(monkeypatch):
monkeypatch.setattr('a._A.__init__', Mock())
def test_a(init_A):
import a
#patch a and use it here
К сожалению, _A.__init__()
уже вызывается до monkeypatch - я подозреваю, что это потому, что monkeypatch должен импортировать a, чтобы изменить его, но как только a импортирован, init уже был вызван.
unittest.mock.patch также ведет себя, предположительно, по той же причине.
Есть ли способ обойти это?
Я подумал об использовании синглтона с ленивой оценкой:
from functools import wraps
def singleton(cls):
@wraps(cls)
def wrapper_singleton(*args, **kwargs):
if not wrapper_singleton.instance:
wrapper_singleton.instance = cls(*args, **kwargs)
return wrapper_singleton.instance
wrapper_singleton.instance = None
return wrapper_singleton
Это работает, но по какой-то причине я не могу устанавливать точки останова отладки, когда мои тесты используют этот синглтон ... Но я думаю Я открою новый вопрос по этому поводу, если действительно подход с использованием глобальных переменных так же невозможен, как кажется.