【问题标题】:How do I patch a method of a property object in python如何在python中修补属性对象的方法
【发布时间】:2015-04-28 17:11:06
【问题描述】:

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

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 以具有引发错误的副作用,以便我可以测试是否按预期记录了未知错误。

我一直无法弄清楚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)

【问题讨论】:

  • 向我们展示您现在如何修补它以及如何导入该属性 - 后者对于找出修补位置非常重要。
  • 将信息添加到主目录。
  • 谢谢你,这增加了一些谜题。最后一点:您说Lunabuild 存在于该文件结构中。你在哪里调用它?是否在同一个模块中?

标签: python unit-testing python-mock


【解决方案1】:

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

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. 要使用它,您应该更多地了解对象以修补正确的东西

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2017-11-30
    • 2020-11-16
    • 1970-01-01
    相关资源
    最近更新 更多