Aiohttp: Параметр "loop_factory" должен быть объявлен явно через косвенную или в самой функции.

Созданный на 12 мар. 2020  ·  3Комментарии  ·  Источник: aio-libs/aiohttp

При попытке обновления с 3.7.2 до 3.8.1 я начал видеть следующее в py.test с тестовым обнаружением:

Параметр "loop_factory" должен быть объявлен явно через косвенную или в самой функции.

Оказывается, что общность заключалась в асинхронных функциях, и, похоже, это было вызвано где-то внутри aiohttp. Я не так хорошо знаком с asyncio или aiohttp, поэтому я счастлив отладить больше с указаниями, но я надеюсь, что у кого-то могут быть другие мысли здесь.

Связанные пакеты:

aiohttp==3.6.2
pytest==5.4.0
pytest-aiohttp==0.3.0
pytest-cov==2.8.1
pytest-forked==1.1.3
pytest-mock==2.0.0
pytest-responses==0.4.0
pytest-xdist==1.31.0

Некоторые подробности о стеке вызовов:

➜  ~/D/zeus (feat/increase-lru-cache) ✗ py.test -x --pdb
=========================================================================================== test session starts ============================================================================================
platform darwin -- Python 3.8.1, pytest-5.4.0, py-1.8.1, pluggy-0.13.1
rootdir: /Users/dcramer/Development/zeus, inifile: setup.cfg
plugins: mock-2.0.0, celery-4.1.1, xdist-1.31.0, aiohttp-0.3.0, forked-1.1.3, responses-0.4.0, cov-2.8.1
collecting 186 items
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> traceback >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
In function "test_health_check":
Parameter "loop_factory" should be declared explicitly via indirect or in function itself
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> entering PDB >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> PDB post_mortem (IO-capturing turned off) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> /Users/dcramer/Development/zeus/.venv/lib/python3.8/site-packages/_pytest/python.py(1144)_validate_explicit_parameters()
-> fail(msg, pytrace=False)
(Pdb) l
1139                    func_name = self.function.__name__
1140                    msg = (
1141                        'In function "{func_name}":\n'
1142                        'Parameter "{arg}" should be declared explicitly via indirect or in function itself'
1143                    ).format(func_name=func_name, arg=arg)
1144 ->                 fail(msg, pytrace=False)
1145
1146
1147    def _find_parametrized_scope(argnames, arg2fixturedefs, indirect):
1148        """Find the most appropriate scope for a parametrized call based on its arguments.
1149
(Pdb) u
> /Users/dcramer/Development/zeus/.venv/lib/python3.8/site-packages/_pytest/python.py(939)parametrize()
-> self._validate_explicit_parameters(argnames, indirect)
(Pdb) l
934
935             self._validate_if_using_arg_names(argnames, indirect)
936
937             arg_values_types = self._resolve_arg_value_types(argnames, indirect)
938
939  ->         self._validate_explicit_parameters(argnames, indirect)
940
941             # Use any already (possibly) generated ids with parametrize Marks.
942             if _param_mark and _param_mark._param_ids_from:
943                 generated_ids = _param_mark._param_ids_from._param_ids_generated
944                 if generated_ids is not None:
(Pdb) u
> /Users/dcramer/Development/zeus/.venv/lib/python3.8/site-packages/aiohttp/pytest_plugin.py(203)pytest_generate_tests()
-> metafunc.parametrize("loop_factory",
(Pdb) l
198                         "Unknown loop '%s', available loops: %s" % (
199                             name, list(factories.keys())))
200                 else:
201                     continue
202             factories[name] = avail_factories[name]
203  ->     metafunc.parametrize("loop_factory",
204                              list(factories.values()),
205                              ids=list(factories.keys()))
206
207
208     @pytest.fixture

Все 3 Комментарий

На самом деле это может не быть связано с 3.8.x, как я сейчас вижу в 3.7.2. Собираюсь продолжить делить пополам.

Это вызвано выпуском pytest==5.4.0 . Я просто обгорел от этого, и откат к pytest<5.4 решает проблему.

Да ты прав. Только что зашел так далеко в моей отладке :).

Надеюсь, это поможет кому-то поискать в Google. Проведу сортировку по pytest.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги