Pytest пропускает пост-выход контекстного менеджера, когда утверждение не удается - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть собственный менеджер контекста, который я использую (но не прибор) для настройки и очистки теста:

@contextmanager
def db_content(*args, **kwargs):
    instance = db_insert( ... )

    yield instance

    db_delete(instance)

def test_my_test():
    with db_content( ... ) as instance:
        #  ...
        assert result

Проблема заключается в том, что когда утверждение не выполняется, код db_delete(), означающий операторы после выхода, не выполняется.

Я вижу, что если я использую прибор, это работает.

@pytest.fixture
def db_instance():
    instance = db_insert( ... )

    yield instance

    db_delete(instance)

def test_my_test(db_instance):
        #  ...
        assert result

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

1 Ответ

0 голосов
/ 12 сентября 2018

contextlib не выполняет операторы после выдачи, если было сгенерировано исключение. Это по замыслу. Чтобы это работало, вы должны написать:

@contextmanager
def db_content(*args, **kwargs):
    instance = db_insert( ... )

    try:
        yield instance

    finally:
        db_delete(instance)

На мой взгляд, это нелогично, поскольку попытка не на самой доходности.

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

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