pytest fixtures 从外部范围重新定义名称\[pylint\]

新手上路,请多包涵

我正在学习 pytest 并使用 pylint 对我的代码进行 lint。但是 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

如果我想将固定装置与函数保存在同一个文件中,最佳做法是什么?

  1. 在所有灯具前加上 _ ?
  2. 禁用此 pylint 检查测试?
  3. 更好的建议?

原文由 oglop 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 597
2 个回答

我刚刚在我的测试文件中禁用了该规则:

 # 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

原文由 Garrett Bates 发布,翻译遵循 CC BY-SA 4.0 许可协议

@pytest.fixturepytest 文档 说:

如果夹具在定义它的同一模块中使用,则夹具的函数名称将被请求夹具的函数 arg 遮盖;解决这个问题的一种方法是命名装饰函数 fixture_<fixturename> 然后使用 @pytest.fixture(name='<fixturename>')

所以这个解决方案类似于您的选项 1,除了 pytest 作者建议 fixture 函数的描述性稍强一点。所以替换这两行

@pytest.fixture
def my_wallet():

和:

 @pytest.fixture(name="my_wallet")
def fixture_my_wallet():

文档中的描述还暗示了另一种解决方案,即将固定装置移入 conftest.py 因此它们与使用固定装置的测试代码不在同一模块中。此位置对于在测试模块之间共享固定装置也很有用。

原文由 hallidave 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题