web-dev-qa-db-fra.com

luminaires pytest Redéfinir le nom de la portée extérieure [pylint]

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?

  1. Ajoutez tous les appareils avec _?
  2. Désactiver cette pylint vérifier les tests?
  3. Une meilleure suggestion?
24
oglop

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
16
Garrett Bates

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.

17
hallidave

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).

4
phd