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

2024-10-03 06:21:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

^{2}$

然后将其用作延迟实例化的属性:

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

LCL类有一个main()方法,该方法运行Lunabuild.configure_作业()方法:

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

我正在尝试修补configure_jobs,使其具有引发错误的副作用,以便测试未知错误是否按预期记录。在

我一直想不出where to patch。它总是告诉我它无法识别属性,或者lunabuild没有configure\u jobs属性。在

我试过很多不同的选择。在附加了调试器的情况下运行,我可以看到下面代码中的测试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)

Tags: 方法pybuildself属性mainconfigure作业
1条回答
网友
1楼 · 发布于 2024-10-03 06:21:09

更简单的方法是在Lunabuild类定义中路径configure_jobs方法的静态引用。所以使用follow代码应该可以满足您的需要

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

如果只想修补测试中使用的对象,可以通过以下方法进行:

^{pr2}$

我的口味是在没有其他机会的情况下使用patch.object

  1. 更复杂的是要明白你在做什么
  2. 要使用它,你应该了解更多的对象来修补正确的东西

相关问题 更多 >