Могут ли крюки pytest использовать приспособления? - PullRequest
2 голосов
/ 29 марта 2019

Я знаю, что приспособления могут использовать другие приспособления, но может ли крюк использовать приспособление? Я много искал в сети, но не смог получить никакой помощи. Может кто-нибудь указать, если я здесь делаю ошибку?

#conftest.py

@pytest.fixture()
def json_loader(request):   
    """Loads the data from given JSON file"""
    def _loader(filename):
        import json
        with open(filename, 'r') as f:
            data = json.load(f)
        return data
    return _loader



def pytest_runtest_setup(item,json_loader): #hook fails to use json_loader
    data = json_loader("some_file.json") 
    print(data) 
    #do something useful here with data

При запуске я получаю следующую ошибку.

pluggy.manager.PluginValidationError: Плагин 'C: \ some_path \ conftest.py' для хука 'pytest_runtest_setup' простое определение: pytest_runtest_setup (item, json_loader) Аргумент (ы) {'json_loader'} объявлен в hookimpl, но не может быть найден в hookspec

Даже если я не передаю json_loader в качестве аргумента функции pytest_runtest_setup (), я получаю сообщение об ошибке, в котором говорится, что «Fixture« json_loader »вызывается напрямую. Фиксации не должны вызываться напрямую»

1 Ответ

1 голос
/ 29 марта 2019

Кажется, что единственный поддерживаемый в настоящее время способ динамического создания экземпляров приборов - это использование приспособления request, в частности, метода getfixturevalue

.

Это недоступно до времени тестирования в ловушке pytest, но вы можете сделать то же самое, используя прибор самостоятельно

Вот (надуманный) пример:

import pytest

@pytest.fixture
def load_data():
    def f(fn):
        # This is a contrived example, in reality you'd load data
        return f'data from {fn}'
    return f


TEST_DATA = None


@pytest.fixture(autouse=True)
def set_global_loaded_test_data(request):
    global TEST_DATA
    data_loader = request.getfixturevalue('load_data')
    orig, TEST_DATA = TEST_DATA, data_loader(f'{request.node.name}.txt')
    yield   
    TEST_DATA = orig


def test_foo():
    assert TEST_DATA == 'data from test_foo.txt'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...