如何在python中修补属性对象的方法

时间:2015-04-28 17:11:06

标签: python unit-testing python-mock

我有一个看起来像这样的包:

lcl
 |
 | - lcl
      | - LCL.py
      | - lunabuild.py

在lunabuild模块中,有一个Lunabuild类。 Lunabuild类有一个方法Lunabuild.configure_jobs()。 LCL类导入lunabuild:

from lcl import lunabuild

然后将其用作懒惰实例化的属性:

@property
def luna_build(self):
  self._luna_build = lunabuild.Lunabuild()

LCL类有一个运行Lunabuild.configure_jobs()方法的main()方法:

main(self)
  try:
    self.luna_build.configure_jobs()
  except ValidationError:
     ...
  except Exception, e:
     return_code = 2
     self.logger_exception(e)

我正在尝试修补configure_jobs以产生引发错误的side_effect,以便我可以测试未按预期记录未知错误。

我一直无法弄明白where to patch。它一直告诉我它不能识别属性,或者lunabuild没有configure_jobs属性。

我尝试了很多不同的选择。运行附加的调试器,我可以看到以下代码中的test_lcl是lcl.lunabuild.Lunabuild对象

更新: 我的最新尝试是

with patch.object('lcl.lunabuild.Lunabuild', 'configure_jobs') as mock:
  mock.side_effect = OSError(2, 'message')
  retcode = test_lcl.main()  
  self.assertEquals(retcode, 2)

1 个答案:

答案 0 :(得分:1)

更简单的方法是在configure_jobs类定义中路径Lunabuild方法的静态引用。因此,使用follow代码应该完全符合您的需要

with patch('lcl.lunabuild.Lunabuild.configure_jobs', side_effect=OSError(2, 'message')) as mock:
    retcode = test_lcl.main()  
    self.assertEquals(retcode, 2)

如果您想要修补您在测试中使用的对象,可以通过以下方式进行修补:

with patch.object(test_lcl.luna_build, 'configure_jobs', side_effect = OSError(2, 'message')) as mock:
    retcode = test_lcl.main()  
    self.assertEquals(retcode, 2)

我的意思是在我没有其他机会时使用patch.object

  1. 理解你在做什么更复杂
  2. 要使用它,您应该了解更多关于修补正确事物的对象