pytest - исправление глобальной переменной перед ее созданием - PullRequest
0 голосов
/ 16 июня 2020

У меня есть глобальная переменная, используемая как синглтон для доступа к оборудованию:

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

Это работает, но по какой-то причине я не могу устанавливать точки останова отладки, когда мои тесты используют этот синглтон ... Но я думаю Я открою новый вопрос по этому поводу, если действительно подход с использованием глобальных переменных так же невозможен, как кажется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...