Meilleure façon de simuler l'attribut de classe dans le test unitaire python
J'ai une classe de base qui définit un attribut de classe et certaines classes enfant qui en dépendent, par exemple,
class Base(object):
assignment = dict(a=1, b=2, c=3)
Je veux unittest cette classe avec différents affectationspar exemple, un dictionnaire vide, seul élément, etc. C'est simplifiée à l'extrême, bien sûr, ce n'est pas une question de refactoring mes classes ou des tests
L' (pytest) tests je suis venu avec, éventuellement, que les travaux sont
from .base import Base
def test_empty(self):
with mock.patch("base.Base.assignment") as a:
a.__get__ = mock.Mock(return_value={})
assert len(Base().assignment.values()) == 0
def test_single(self):
with mock.patch("base.Base.assignment") as a:
a.__get__ = mock.Mock(return_value={'a':1})
assert len(Base().assignment.values()) == 1
C'est plutôt compliqué et hacky - je n'ai même pas bien comprendre pourquoi ça marche (je suis familier avec les descripteurs). N'maquette magiquement transformer les attributs de classe dans les descripteurs?
Une solution qui permettrait de se sentir plus logique ne fonctionne pas:
def test_single(self):
with mock.patch("base.Base") as a:
a.assignment = mock.PropertyMock(return_value={'a':1})
assert len(Base().assignment.values()) == 1
ou tout simplement
def test_single(self):
with mock.patch("base.Base") as a:
a.assignment = {'a':1}
assert len(Base().assignment.values()) == 1
D'autres variantes que j'ai essayé ne fonctionnent pas non plus (affectations reste inchangé dans le test).
Quelle est la bonne façon de se moquer d'un attribut de classe? Est-il mieux /plus compréhensible que celui ci-dessus?
source d'informationauteur Ivo van der Wijk
Vous devez vous connecter pour publier un commentaire.
base.Base.assignment
est simplement remplacé par unMock
objet. Vous fait un descripteur par l'ajout d'un__get__
méthode.C'est un peu bavard et un peu inutiles, vous pouvez simplement définir
base.Base.assignment
directement:Ce n'est pas trop fort lors de l'utilisation de test de la concurrence, bien sûr.
D'utiliser un
PropertyMock
j'utiliserais:ou encore:
Pour améliorer la lisibilité, vous pouvez utiliser le
@patch
décorateur:Vous pouvez trouver plus de détails à http://www.voidspace.org.uk/python/mock/patch.html#mock.patch.
Si votre classe (File d'attente par exemple) dans déjà importé à l'intérieur de votre test et vous souhaitez patch MAX_RETRY attr - vous pouvez utiliser @patch.objet ou tout simplement mieux @patch.plusieurs
Je suis peut-être raté quelque chose, mais n'est-ce pas possible sans l'aide de
PropertyMock
?Voici un exemple de comment des tests unitaires votre
Base
classe:dict
etint
)@patch
décorateur etpytest
cadre avecpython 2.7+
ou3+
.