J'apprends pytest et je peluche mon code avec pylint. Mais Pylint se plaint toujours de:W0621: Redefining name %r from outer scope (line %s)
pour l'exemple suivant de 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
Redéfinir le nom my_wallet
de la portée externe.
J'ai trouvé une solution de contournement pour ajouter _
préfixe du nom du luminaire: _my_wallet
.
Quelle serait la meilleure pratique si je souhaite conserver les appareils dans le même fichier que les fonctions?
_
?pylint
vérifier les tests?Je viens de désactiver cette règle dans mes fichiers de test:
# 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
Les documents pytest pour @pytest.fixture
Disent ceci:
Si un appareil est utilisé dans le même module dans lequel il est défini, le nom de la fonction de l'appareil sera masqué par l'argument de fonction qui demande l'appareil. une façon de résoudre ce problème consiste à nommer la fonction décorée
fixture_<fixturename>
, puis à utiliser@pytest.fixture(name='<fixturename>')
.
Cette solution est donc similaire à votre option 1, sauf que l'auteur du pytest suggère un nom légèrement plus descriptif pour la fonction fixture.
La description dans la documentation suggère également une autre solution qui consiste à déplacer les appareils dans conftest.py
Afin qu'ils ne soient pas dans le même module que le code de test utilisant les appareils. Cet emplacement est également utile pour partager des appareils entre les modules de test.
Il est généralement désactivé ( 1 , 2 ).
Il existe un plugin pylint-pytest qui a tenté de résoudre certains problèmes. Mais l'erreur W0621
n'est pas encore corrigé et le plugin semble abandonné (la dernière mise à jour date de 2013).