pytest fixtures Переопределение имени из внешнего объема [pylint]
Я изучаю pytest, и я накладываю свой код на pylint. Но пилинт все еще жалуется:
W0621: Redefining name %r from outer scope (line %s)
для следующего примера из pytest:
# test_wallet.py
@pytest.fixture
def my_wallet():
'''Returns a Wallet instance with a zero balance'''
return Wallet()
@pytest.mark.parametrize("earned,spent,expected", [
(30, 10, 20),
(20, 2, 18),
])
def test_transactions(my_wallet, earned, spent, expected):
my_wallet.add_cash(earned)
my_wallet.spend_cash(spent)
assert my_wallet.balance == expected
Переопределение имени my_wallet
из внешней области.
Я нашел обходное решение, чтобы добавить _
префикс к имени прибора: _my_wallet
.
Какая была бы лучшая практика, если я хочу сохранить светильники в одном файле как функции?
- Подготовьте все светильники с помощью
_
? - Отключить эту проверку
pylint
для тестов? - Лучшее предложение?
Ответы
Ответ 1
Я просто отключил это правило в моих тестовых файлах:
# pylint: disable=redefined-outer-name
# ^^^ this
import pytest
@pytest.fixture
def my_wallet():
'''Returns a Wallet instance with a zero balance'''
return Wallet()
@pytest.mark.parametrize("earned,spent,expected", [
(30, 10, 20),
(20, 2, 18),
])
def test_transactions(my_wallet, earned, spent, expected):
my_wallet.add_cash(earned)
my_wallet.spend_cash(spent)
assert my_wallet.balance == expected
Ответ 2
Он обычно отключен (1, 2).
Существует плагин pylint-pytest, который пытался исправить некоторые проблемы. Но ошибка W0621
еще не исправлена, и плагин кажется заброшенным (последнее обновление было в 2013 году).
Ответ 3
Документы Pytest для @pytest.fixture
говорят следующее:
Если прибор используется в том же модуле, в котором он определен, имя функции прибора будет затенено функцией arg, которая запрашивает прибор; Одним из способов решения этой проблемы является присвоение имени украшенной функции fixture_<fixturename>
а затем использование @pytest.fixture(name='<fixturename>')
.
Таким образом, это решение аналогично вашему варианту 1, за исключением того, что автор pytest предлагает немного более описательное имя для функции фикстуры.
Описание в документации также указывает на другое решение, которое заключается в перемещении приборов в conftest.py
чтобы они не находились в том же модуле, что и тестовый код, использующий приборы. Это расположение также полезно для совместного использования приборов между тестовыми модулями.