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

时间:2017-09-07 06:39:26

标签: python pytest pylint fixture

我正在学习pytest,我用pylint来代替我的代码。 但是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. 预设所有灯具
  3. 禁用此pylint检查测试?
  4. 更好的建议?

4 个答案:

答案 0 :(得分:5)

我只是在测试文件中禁用了该规则:

# 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

答案 1 :(得分:4)

通常会被停用(12)。

有一个pylint-pytest插件试图解决一些问题。但错误W0621尚未修复,插件似乎已被放弃(最后一次更新是在2013年)。

答案 2 :(得分:1)

@pytest.fixture的{​​{3}}这样说:

  

如果在定义了灯具的模块中使用了灯具,则   灯具的功能名称将被功能arg遮盖   要求装置;解决此问题的一种方法是为装饰命名   函数fixture_<fixturename>然后使用   @pytest.fixture(name='<fixturename>')

因此,该解决方案与您的选项1类似,不同的是pytest作者建议了Fixture函数的名称更具描述性。

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

答案 3 :(得分:0)

在def中添加fixture和fixture_前缀的名称参数。

@pytest.fixture(name="wallet")
def fixture_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