Donc, ce que je voudrais réaliser, c'est de déranger automatiquement les fonctions de divers modules avec pytest. Donc, je définissais dans mon conftest.py:Comment ajouter dynamiquement de nouveaux appareils à un test basé sur la signature de l'appareil d'un test
import sys
import __builtin__
from itertools import chain
# Fixture factory magic START
NORMAL_MOCKS = [
"logger", "error", "logging", "base_error", "partial"]
BUILTIN_MOCKS = ["exit"]
def _mock_factory(name, builtin):
def _mock(monkeypatch, request):
module = __builtin__ if builtin else request.node.module.MODULE
ret = Mock()
monkeypatch.setattr(module, name, ret)
return ret
return _mock
iterable = chain(
((el, False) for el in NORMAL_MOCKS),
((el, True) for el in BUILTIN_MOCKS))
for name, builtin in iterable:
fname = "mock_{name}".format(name=name)
_tmp_fn = pytest.fixture(name=fname)(_mock_factory(name, builtin))
_tmp_fn.__name__ = fname
setattr(
sys.modules[__name__],
"mock_{name}".format(name=name), _tmp_fn)
# Fixture normal factory magic END
Cela fonctionne et tout, mais je voudrais d'omettre l'utilisation des listes NORMAL_MOCKS
et BUILTIN_MOCKS
. Donc, fondamentalement, dans un crochet pytest je devrais être capable de voir que dire il ya un appareil mock_foo
, mais ce n'est pas encore enregistré, alors je crée un faux pour cela avec l'usine et l'enregistrer. Je ne pouvais pas comprendre comment faire ça. Fondamentalement, je regardais dans la fonction pytest_runtest_setup
, mais je ne pouvais pas comprendre comment faire l'enregistrement de l'appareil. Donc, fondamentalement, je voudrais savoir avec quel hook/appel puis-je enregistrer de nouvelles fonctions de fixation par programmation de ce crochet.
La solution finale basée sur les conseils de @ sergey-vasilyev peut être trouvée ici -> https://gist.github.com/dpapp-hortonworks/6224068ffc11d18c500b75a861941dfb –