我在学python
我想知道是否有一种机制可以将一个对象(在我的例子中是一个伪对象)“注入”到被测类中,而不显式地将它添加到costructor/setter中。在
## source file
class MyBusinessClass():
def __init__(self):
self.__engine = RepperEngine()
def doSomething(self):
## bla bla ...
success
## test file
## fake I'd like to inkject
class MyBusinessClassFake():
def __init__(self):
pass
def myPrint(self) :
print ("Hello from Mock !!!!")
class Test(unittest.TestCase):
## is there an automatic mechanism to inject MyBusinessClassFake
## into MyBusinessClass without costructor/setter?
def test_XXXXX_whenYYYYYY(self):
unit = MyBusinessClass()
unit.doSomething()
self.assertTrue(.....)
在我的测试中,我想“注入”对象“引擎”,而不把它传递给构造器。我尝试过几个选项(例如:@patch…)但没有成功。在
@Dan的回答非常透彻,但只是为了增加讨论:
我是一个从函数范围中删除样板代码的装饰器的忠实粉丝。在
虽然将依赖项作为另一个参数非常简单,但它添加了无关的代码以确保在大多数上下文中初始化所有依赖项。在
也就是说,我维护了一个模块来处理这个问题:Injectable,它为Python 3提供了一个
@autowired
修饰符,以实现简单而干净的依赖注入:decorator的全部目的是像这样转换代码:
进入这个:
^{2}$没有复杂的东西,没有设置,没有强制执行的工作流。现在你的函数代码不再是依赖初始化代码的混乱了。在
装饰方法非常简约。也许一个成熟的框架更适合你。为此,有一些优秀的模块,如Injector。在
Python中不需要IOC。这是一个Python式的方法。在
您还可以去掉类来绕过构造函数
^{2}$然后在你的设置中
现在在测试中,您可以使用上下文管理器。在
如果您想在不使用构造函数的情况下注入它,那么可以将其作为类属性添加。在
现在要绕过存根
__init__
:现在您可以简单地指定值:
您的问题似乎有些不清楚,但是没有什么可以阻止您使用类继承来重写原始方法。在这种情况下,派生类将如下所示:
相关问题 更多 >
编程相关推荐