如何在 python 中修补 属性 对象的方法
How do I patch a method of a property object in python
我有一个看起来像这样的包裹:
lcl
|
| - lcl
| - LCL.py
| - lunabuild.py
在 lunabuild 模块中,有一个 Lunabuild class。 Lunabuild class 有一个方法 Lunabuild.configure_jobs()。
LCL class 导入 lunabuild:
from lcl import lunabuild
然后将其用作延迟实例化 属性:
@property
def luna_build(self):
self._luna_build = lunabuild.Lunabuild()
LCL class 有一个运行 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)
更简单的方法是在 Lunabuild
class 定义中路径 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
:
- 理解你在做什么更复杂
- 要使用它,您应该更多地了解对象以修补正确的东西
我有一个看起来像这样的包裹:
lcl
|
| - lcl
| - LCL.py
| - lunabuild.py
在 lunabuild 模块中,有一个 Lunabuild class。 Lunabuild class 有一个方法 Lunabuild.configure_jobs()。 LCL class 导入 lunabuild:
from lcl import lunabuild
然后将其用作延迟实例化 属性:
@property
def luna_build(self):
self._luna_build = lunabuild.Lunabuild()
LCL class 有一个运行 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)
更简单的方法是在 Lunabuild
class 定义中路径 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
:
- 理解你在做什么更复杂
- 要使用它,您应该更多地了解对象以修补正确的东西