我想知道是否可以在Python的测试环境中更改helper函数。我的应用程序结构如下:app/
trader/
__init__.py
strategies/
__init__.py
base_strategy.py
util.py
models/
__init__.py
base_model.py
tests/
__init__.py
strategies/
__init__.py
stub_strategy.py
test_strategies.py
models/
__init__.py
stub_model.py
其中每个base_*.py是一个抽象基类,从tests目录中的每个stub_*.py文件继承而来。在我的util.py文件中,有一个helper函数,它可以查看trader/strategies/models目录并注册所有可用的模型:
^{pr2}$
现在我的问题是:在我的BaseTradingStrategy-类中,我有一个方法,它使用existing_alpha_models列表来检查模型是否存在。在from abc import ABC, abstractmethod
from .util import existing_alpha_models
class BaseTradingStrategy(ABC):
"""BaseTrading Code comes here"""
@abstractmethod
def some_abs_method(self):
raise NotImplementedError
def register_model(self, model_name):
if model_name not in existing_alpha_models:
raise ValueError
对于单元测试,我已经创建了存根类,它们不在trader/strategies/models目录中,因此没有在existing_alpha_models列表中注册。当我想用pytest测试ABC的功能时,许多测试都失败了,因为检查模型可用性的方法失败了。一个简单的解决方案是将存根类放在我的应用程序的trader目录中,但我宁愿将我的测试代码与应用程序的其余部分分开。我可能还可以将existing_alpha_models作为基类的属性,但是除了让测试通过之外,我并不认为这样做有什么意义。有没有一种方法可以在existing_alpha_models中注入存根类进行单元测试,这样ABC的测试在不改变基类的情况下不会失败吗?在
------------编辑------------------
我现在有两个我的测试代码的工作版本。一个是使用@hoefling的verison,我只需将alpha_models添加到existing_alpha_models列表中:from tests.strategies import StubTradingStrategy
from tests.strategies.alpha_models import StubModel, StubModel2, StubModel3
from trader.strategies.util import existing_alpha_models
existing_alpha_models.extend(["StubModel", "StubModel2", "StubModel3"])
还有一个版本,我将模型添加到alpha_models模块并重新加载2个模块:import importlib
from trader.strategies import alpha_models
from tests.strategies.alpha_models import StubModel, StubModel2, StubModel3
setattr(alpha_models, "StubModel", StubModel)
setattr(alpha_models, "StubModel2", StubModel2)
setattr(alpha_models, "StubModel3", StubModel3)
from nutrader.strategies import util
import nutrader.strategies.base_strategy
importlib.reload(util)
importlib.reload(nutrader.strategies.base_strategy)
from tests.strategies import StubTradingStrategy
第二个版本的优点是它允许我实际测试util代码,但是它也在我的测试代码中引入了潜在的风险,因为某些模块存在2个版本,这在生产环境中不是这样。这是个好主意,还是应该在测试环境的第一个版本中保留它?在