Невозможно использовать приспособление автоиспользования для импорта модуля

У меня есть тестовый модуль с одним приспособлением для автоматического использования

import pytest

@pytest.fixture(autouse=True):
def set_env_config(monkeypatch):
    palladium_config =   os.path.join(os.path.dirname(os.path.dirname(os.getcwd())), 'config.py')
    monkeypatch.setenv('PALLADIUM_CONFIG', palladium_config)
    from A import B

и в каждом последующем тесте внутри этого тестового модуля требуется класс B, но этот импорт не может быть достигнут ни для каких тестов.

В противном случае я исправляю только переменную окружения только

@pytest.fixture(autouse=True):
def set_env_config(monkeypatch):
    palladium_config =   os.path.join(os.path.dirname(os.path.dirname(os.getcwd())), 'config.py')
    monkeypatch.setenv('PALLADIUM_CONFIG', palladium_config)

и импортировать класс B в каждом тестовом случае, это удалось.

Почему это ? почему я не могу импортировать класс в приспособление для автоматического использования

большое спасибо


person Hello lad    schedule 17.07.2015    source источник
comment
Какую ошибку или трассировку стека вы видите?   -  person Frank T    schedule 16.09.2015


Ответы (1)


Я предполагаю, что вы ожидаете что-то вроде следующего:

@pytest.fixture(autouse=True)
def do_an_import():
    from A import B

def test_foo():
    assert B.do_my_thing() == 'foo'

Это не работает, а следующее делает то, что вы хотите:

def test_foo():
    from A import B
    assert B.do_my_thing() == 'foo'

К сожалению, выполнение импорта в фикстуре (первый пример) добавит B в пространство имен этой функции фикстуры, но не в пространство имен тестовой функции.

Точно так же это не сработает по той же причине:

@pytest.fixture
def not_an_autouse_fixture():
    from A import B

def test_foo(not_an_autouse_fixture):
    assert B.do_my_thing() == 'foo'

B импортируется в пространство имен прибора, которое отличается от пространства имен теста. Вместо этого вы могли бы сделать:

@pytest.fixture
def Cls():
    from A import B
    return B

def test_foo(Cls):
    assert Cls.do_my_thing() == 'foo'

или вы можете импортировать его на верхнем уровне вашего модуля, например:

from A import B

def test_foo(B):
    assert B.do_my_thing() == 'foo'
person Frank T    schedule 16.09.2015