所以我想實現的是用pytest自動模擬各個模塊中的函數。所以,我在conftest.py定義是:如何根據測試的燈具簽名動態地添加新的燈具到測試
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
這個工作和一切,但我想省略NORMAL_MOCKS
和BUILTIN_MOCKS
列表的使用。所以基本上在一個pytest鉤子我應該能夠看到,說有一個mock_foo
夾具,但它尚未註冊,所以我創建一個工廠模擬並註冊它。我只是無法弄清楚如何做到這一點。基本上我正在研究pytest_runtest_setup
函數,但無法弄清楚如何進行實際的燈具註冊。所以基本上我想知道哪個鉤子/調用可以從這個鉤子編程地註冊新的fixture函數。
基於@謝爾蓋 - 瓦西里耶夫的意見,最終的解決方案可以在這裏找到 - > https://gist.github.com/dpapp-hortonworks/6224068ffc11d18c500b75a861941dfb –