使用Python进行单元测试中的依赖注入

卡斯珀

我正在学习python

我想知道是否有一种机制可以将对象(在我的情况下为假对象)“注入”到要测试的类中,而无需在构造函数/设置器中显式添加对象。

## 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 ...)而没有成功。

Python不需要IOC。这是一种Python方法。

class MyBusinessClass(object):
    def __init__(self, engine=None):
        self._engine = engine or RepperEngine() 
        # Note: _engine doesn't exist until constructor is called.

    def doSomething(self):
        ## bla bla ...
        success

class Test(unittest.TestCase):

    def test_XXXXX_whenYYYYYY(self):
        mock_engine = mock.create_autospec(RepperEngine)
        unit = MyBusinessClass(mock_engine)
        unit.doSomething()
        self.assertTrue(.....)

您也可以将类存根以绕开构造函数

class MyBusinessClassFake(MyBusinessClass):
   def __init__(self):  # we bypass super's init here
      self._engine = None

然后在您的设置中

def setUp(self):
  self.helper = MyBusinessClassFake()

现在,您可以在测试中使用上下文管理器。

def test_XXXXX_whenYYYYYY(self):
  with mock.patch.object(self.helper, '_engine', autospec=True) as mock_eng:
     ...

如果要使用构造函数不加注入,则可以将其添加为类属性。

class MyBusinessClass():
    _engine = None
    def __init__(self):
        self._engine = RepperEngine() 

现在存根绕过__init__

class MyBusinessClassFake(MyBusinessClass):
   def __init__(self):
      pass

现在,您只需分配值即可:

unit = MyBusinessClassFake()
unit._engine = mock.create_autospec(RepperEngine)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

对我进行依赖注入的方法进行单元测试

在Spring中进行单元测试:将依赖项注入到被测组件中

如何使用依赖注入.net Core 2进行单元测试

angular2中的单元测试,依赖注入

带有依赖注入的Typescript中的单元测试

在单元测试类中使用依赖注入

单元测试依赖项注入

Laravel单元测试依赖注入

在点网核心中进行依赖注入的单元测试中Moq的设置方法是什么

如何使用构造函数依赖项注入对asp.net核心应用程序进行单元测试

使用依赖注入,我发现自己创建了工厂来进行单元测试。这正常吗?

如何使用http作为依赖项进行单元测试

对使用getBean(“ myService”)的依赖项进行类的单元测试

如何正确使用大量依赖项进行单元测试

如何在python中伪造缺少的依赖项以进行单元测试?

如何使用在方法中具有依赖项的moq来对类进行单元测试?

使用 Ninject 注入依赖而不使用构造函数注入 - 单元测试

如何对依赖的 if 语句进行单元测试?

如何对依赖的cpde进行单元测试

将依赖项注入过滤器以进行单元测试

使用Python单元测试进行Scala测试

在Python3中使用单元测试和正常进行测试之间的区别

如何在单元测试中从依赖项注入容器中获取实例?

在单元测试中模拟注入的字段

Jasmine / AngularJS:将依赖服务注入到单元测试中?

Angular 7单元测试依赖项注入在ngOnInit中不起作用

是否有任何理由(单元测试除外)使用Angular2依赖注入?

如何在Spring Boot单元测试中使用依赖注入?

在 Python3 中使用单元测试进行单元测试