我正在学习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
。
如果我想将灯具保存在与功能相同的文件中,那么最佳做法是什么?
_
?pylint
检查测试?答案 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)
有一个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